C语言中的排序算法--冒泡排序,选择排序,希尔排序
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端
维基百科:点击打开链接
- /*
- 用选择法对10个数进行排序
- */
- #include<stdio.h>
- void main()
- {
- int i,j,a[10];
- for(i=0;i<10;i++)
- scanf("%d",&a[i]);
- for(i=0;i<9;i++)
- {//n个数要进行n-1趟比较
- for(j=0;j<=9-i;j++) //每趟比较n-i次
- if(a[j]>a[j+1]) //依次比较两个相邻的数,将小数放在前面,大数放在后面
- {
- int t=a[j];
- a[j]=a[j+1];
- a[j+1]=t;
- }
- }
- for(i=0;i<10;++i) //输出比较之后的数组
- printf(" %d",a[i]);
- }
另一种常见的写法
- /*
- 冒泡排序的另外一种写法
- */
- #include<stdio.h>
- void BubbleSort(int a[],int n)
- {
- int i,j;
- for(i=n-1;i>0;--i) //从n-1循环的到0,也是n次
- for(j=0;j<i;j++)
- if(a[j]>a[j+1])
- {
- int temp=a[j];
- a[j]=a[j+1];
- a[j+1]=temp;
- }
- }
- void main()
- {
- int a[10],i;
- for(i=0;i<10;i++)
- scanf("%d",&a[i]);
- BubbleSort(a,10);
- printf("排序后的数组:\n");
- for(i=0;i<10;i++)
- printf(" %d",a[i]);
- }
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕。
- #include<stdio.h>
- void SelectSort(int a[],int n)
- {
- int i,j;
- for(i=0;i<n-1;i++) //n个数要进行n-1趟比较,每次确定一个最小数放在a[i]中
- {
- int k=i; //假设a[0]是最小的数,把下标0放在变量K里面,
- for(j=i+1;j<n;j++)
- if(a[k]>a[j]) k=j; //如果a[k]>a[j] 前面的数比后面的数大,交换下标,此时k指向小的数
- if(k!=i)
- {
- int temp=a[i];
- a[i]=a[k];
- a[k]=temp;
- }
- }
- }
- void main()
- {
- int a[10],i;
- for(i=0;i<10;i++)
- scanf("%d",&a[i]);
- SelectSort(a,10);
- printf("排序后的数组:\n");
- for(i=0;i<10;i++)
- printf(" %d",a[i]);
- }
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。
一个更好理解的希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i += step_size
而不是i++
)。
例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
然后我们对每列进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
当我们以单行来读取数据时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序(此时就是简单的插入排序了)。
- //希尔排序
- #include<stdio.h>
- #define LT(a,b) ((a)<(b))
- #define MAX_SIZE 20
- #define T 3
- #define N 10
- typedef int KeyType;
- typedef int InfoType;
- typedef struct
- {
- KeyType key;
- InfoType otherinfo;
- }RedType;
- typedef struct
- {
- RedType r[MAX_SIZE+1];
- int length;
- }SqList;
- void PrintSqList(SqList L)
- {
- int i;
- for(i=1;i<L.length;i++)
- {
- printf("(%d %d)",L.r[i].key,L.r[i].otherinfo);
- }
- printf("\n");
- }
- int PrintSqlListKey(SqList L)
- {
- int i;
- for(i=1;i<L.length;i++)
- {
- printf("%d ",L.r[i].key);
- }
- printf("\n");
- return 0;
- }
- void ShellInsert(SqList &L,int dk)
- {
- int i,j;
- for(i=dk+1;i<=L.length;i++)
- {
- if LT(L.r[i].key,L.r[i-dk].key)
- {
- L.r[0]=L.r[i];
- for(j=i-dk;j<0&& LT(L.r[i].key,L.r[j].key);j-=dk)
- {
- L.r[j+dk]=L.r[j];
- }
- L.r[j+dk]=L.r[0];
- }
- }
- }
- void ShellSort(SqList &L,int dlta[],int t)
- {
- int k;
- for(k=0;k<t;k++) //对所有增量序列
- {
- ShellInsert(L,dlta[k]);
- printf("dlta[%d]=%d,第%d趟排序结果(仅输出关键字):",k,dlta[k],k+1);
- PrintSqlListKey(L);
- }
- }
- void main()
- {
- RedType d[N]={{49,1},{38,2},{65,3},{97,4},{76,65},{13,6},{27,7},{49,8},{55,9},{4,10}};
- SqList m;
- int i,dt[T]={5,3,1};
- for(i=0;i<N;i++)
- {
- m.r[i+1]=d[i];
- }
- m.length=N;
- printf("希尔排序前:\n");
- PrintSqList(m);
- printf("\n");
- ShellSort(m,dt,T);
- printf("希尔排序后:\n");
- PrintSqList(m);
- printf("\n");
- }
C语言中的排序算法--冒泡排序,选择排序,希尔排序的更多相关文章
- Java排序算法(四)希尔排序2
Java排序算法(四)希尔排序2 希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { ...
- 排序算法<No.7>【希尔排序】
排序算法进入到第7篇,这个也还是比较基础的一种,希尔排序,该排序算法,是依据该算法的发明人donald shell的名字命名的.1959年,shell基于传统的直接插入排序算法,对其性能做了下提升,其 ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
- Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始
1. 前言 本文将介绍希尔排序.归并排序.基数排序(桶排序).堆排序. 在所有的排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. ...
- 排序算法:Java实现希尔排序
希尔排序的思路是先分组再整合 先对下标进行分组,比如当数组长度为20时,一开始选定一个间隔值为10 对数组进行排序,每隔10个元素比较大小并交换,以下标为间隔,1和11比较.2和12比较......1 ...
- 排序算法Java实现(希尔排序)
算法描述:先将待排序序列的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序序列“基本有序”后,再对所有元素进行一次直接插入排序. packa ...
- Java排序算法(四)希尔排序1
希尔排序交换法:分组+冒泡排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { private static fina ...
- php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序
<?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){ $num=count($arr); ...
- C语言排序算法之简单交换法排序,直接选择排序,冒泡排序
C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...
随机推荐
- 再次了解android中屏幕尺寸,单位等
android设备多种多样,要让你的app能够适配所有的屏幕是一件很痛苦的事情,在做适配之前我们首先需要了解android中dimension的定义 android中dimension是如何定义的? ...
- Codeforces Gym 100431B Binary Search 搜索+组合数学+高精度
原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...
- LightOj 1215 Finding LCM
Discription LCM is an abbreviation used for Least Common Multiple in Mathematics. We say LCM (a, b, ...
- Java方法中传值和引用传递的问题(转)
说明:标题其实说法是错误的.Java中只有值传递,没有引用传递. ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = ...
- 【springcloud】使用@FEIGNCLIENT时,报JAVA.LANG.NOCLASSDEFFOUNDERROR: FEIGN/FEIGN$BUILDER错
引用地址:http://www.cnblogs.com/ellacan/p/8822374.html 错误信息: Caused by: java.lang.ClassNotFoundException ...
- DICOM:DICOM Print 服务详细介绍
目录(?)[-] 背景 DICOM Print服务数据流 DICOM Print服务各部分关系 DICOM Print服务具体实现 背景: 昨天专栏中发表了一篇关于DICOM Print的博文 ...
- 江湖问题研究-- intent传递有没有限制大小,是多少?
出门一步,便是江湖.江湖上有很多流言. 比方这条: intent传递是有限制大小的,详细在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜慘叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...
- dos alias/cname address
diego@localhost sdk/include/Poco/Net]# dig b.wpss.cn ; <<>> DiG - <<>> b.wps ...
- MySQL插入数据性能调优
插入数据性能调优总结: 1.SQL插入语句调优 2.如果是InnoDB引擎的话,尝试开启事务,批量提交 3.调整MySQl数据库配置 参考: 百度空间 - MySQL插入数据性能调优 CSDN ...
- 实现iOS7上tableView的切割线像iOS6中的效果
iOS7上tableView的切割线左边短了一点,要实现和iOS6中的效果还是有方法的,UITableView头文件中个属性: @property (nonatomic) UIEdge ...