预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

希尔排序算法的C语言实现示例希尔排序算法的C语言实现示例希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。下面小编为大家整理了希尔排序算法的C语言实现示例,希望能帮到大家!希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的'步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。一个更好理解的希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i+=step_size而不是i++)。C语言实现示例#include#include#include#defineLEN10typedefintdataType;//初始化数组,赋值整数随机数voidinitArr(dataTypearr[],intlen);//希尔排序voidshellSort(dataTypearr[],intlen);//交换两个数voidswap(dataType&x,dataType&y);//打印数组元素voidprint(dataTypearr[],intlen);intmain(){dataTypearr[LEN];initArr(arr,LEN);printf("================希尔排序================");//输出排序前的数组元素printf("n排序前数组元素:");print(arr,LEN);shellSort(arr,LEN);printf("n排序后数组元素:");print(arr,LEN);printf("n");return0;}//初始化数组,赋值整数随机数voidinitArr(dataTypearr[],intlen){inti=0;srand((unsigned)time(NULL));for(i=0;i<len;i++)arr[i]=rand();}//希尔排序voidshellSort(dataTypearr[],intlen){inth=0;inti=0;intj=0;//设置步长for(h=1;h<len;h=3*h+1);while(h){h/=3;if(h<1)break;for(i=h;i<len;i++)for(j=i;j>=h;j-=h){if(arr[j-h]<arr[j])break;swap(arr[j-h],arr[j]);}}}//交换两个数voidswap(dataType&x,dataType&y){dataTypetemp;temp=x;x=y;y=temp;}//打印数组元素voidprint(dataTypearr[],intlen){inti=0;for(i=0;i<LEN;i++){if(i%5==0){printf("n");}printf("%dt",arr[i]);}}