introduction to algorithms sorting lesson_3 shell sorting

来源:互联网 发布:考研什么时候报班 知乎 编辑:程序博客网 时间:2024/06/07 02:46

作为插入排序的改进算法  希尔排序 shell sort

基本思想:对于排序数量较少的数据,运用直接插入排序可以很快,效率很高

基于这一点,希尔排序的想法是:将原数据分成若干数据量较少的组,分别进行排序,则这些数据基本有序,最后对全体进行一次插入排序即可。

假设有10数据,如:49  29  30  12   32  59  99  04  95 09  

分组的步骤是:第一趟希尔插入排序,选取间隔为5的数据,则分组为<49  59>   <29,99>  < 30,04>  ,<12 , 95 > <32 ,09>

                            第二趟希尔插入排序,间隔减少为3

                            第三趟希尔插入排序,间隔为1   则完成排序

代码:

/*********shell sorting***********/
#define getArraySize(arrayName) (sizeof(arrayName)/sizeof(arrayName[0]))void shellinsert(int data[],int len,int dk){int key;int i,j;for(i=dk;i<len;i++)   //一次希尔插入排序{if (data[i]<data[i-dk]){key=data[i];for (j=i-dk;j>=0&&data[j]>key;j-= dk){data[j+dk]=data[j];}data[j+ dk]=key;}}}void shell(int data[],int lda,int dk[],int t)//增量多次希尔插入排序{  for(int k=0;k<t;k++)  shellinsert(data,lda,dk[k]);}
测试:

int _tmain(int argc, _TCHAR* argv[]){int data_test[10]={1,0,2,9,3,1,5,8,9,10};int dk[3]={5,3,1};shell(data_test,getArraySize(data_test),dk,getArraySize(dk));//getArraySize 获取数组长度prtarray(data_test,getArraySize(data_test));//打印数组system("pause");return 0;}
希尔排序分析:

由于希尔排序与数据本身的排序有复杂的关系,增量序列也难以分析,目前还没有解决希尔排序的严格证明。

数据结构教材:通过实验的方法,希尔排序的时间复杂度 O(n^1.3)


0 0
原创粉丝点击