【算法】希尔排序

来源:互联网 发布:c语言是面向过程 编辑:程序博客网 时间:2024/05/16 06:52

1.定义

是直接插入排序算法的一种更高效的改进版本,也称缩小增量排序
把记录按下标的一定增量分组,对每组使用直接插入排序算法排序
随着增量逐渐减少,每组包含的关键词越来越多
当增量减至1时,整个文件恰被分成一组,算法便终止
 
 
 

2.过程(说明定义)

初始序列: 48 , 37 , 64 , 96 , 75 , 12 , 26 , 48 , 54 , 03

第①趟 : [ 12 , 26 , 48 , 54 , 03] [ 48 , 37 , 64 , 96 , 75 ]
                增量为5,分为2个分组,各个分组内同一位置的数字进行插入排序

第②趟 : [ 12 , 03 , 48 ] [ 37 , 26 , 48 ] [ 54 , 64 , 96 ] [ 75 ]
                 增量为3,分为4个分组,各个分组内同一位置的数字进行插入排序

第③趟 : [ 03 ] [ 12 ] [ 26 ] [ 37 ] [ 48 ] [ 48 ] [ 54 ] [ 64 ] [ 75 ] [ 96 ]
                 增量为1,分为10个分组,全部进行插入排序
 
 
 

3.代码-C/C++(实现过程)

void ShellSort(int data[],int n) {     int *delta,k,i,t,dk,j;     k=n;     delta=(int *)malloc(sizeof(int)*(n/2));     i=0;     do{         k=k/2;          delta[i++]=k;     }while(k>1);     i=0;     while((dk=delta[i])>0)     {         if(data[k]<data[k-dk])         {             t=data[k];             for(j=k-dk;j>=0&&t<data[j];j=dk)                 data[j+dk]=data[j];             data[j+dk]=t;         }         ++i;     } }

 
 
 

4.算法分析

时间复杂度为最好情况为O(n),最坏为O(n²)
相比插入排序,希尔排序它减少了复制的次数,在排序前期,尽可能让元素在其位置上,减少了移动次数,所以提高了效率
最后,这个一个不稳定的算法,因为在排序过程中,相同的元素会在自己的排序中移动位置,稳定性打乱

0 0
原创粉丝点击