shell排序算法描述:
我们简单处理增量序列:增量序列d = {n/2 ,n/4, n/8 …..1} n为要排序数的个数 ,即:先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。
Shell排序示例如下:
代码实现如下:
#include<stdio.h>
void ShellSort(int arr[],int n){
int step=n/2; //取增量
while(step>=1){
for(int i=step;i<n;i++){
int temp=arr[i]; //从这一行开始就是直接插入排序
int j;
for(j=i-step;j>-1&&temp<arr[j];j-=step){
arr[j+step]=arr[j];
}
arr[j+step]=temp; //直接插入排序到这里结束,其实把step换成1就是直接插入排序了。
}
step=step/2; //每一次把增量除以2
}
}
int main(void)
{
int a[8]={4,2,5,8,3,7,6,9};
ShellSort(a,8);
for(int i=0;i<8;i++)
printf("%4d",a[i]);
}
Shell排序的时间性能优于直接插入排序:
希尔排序的时间性能优于直接插入排序的原因:
①当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
②当n值较小时,n和n^2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n^2)差别不大。
③在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插入排序有较大的改进。
总结:Shell排序时间复杂度:在最优的情况下,时间复杂度为:O(n ^ (1.3) ) (元素已经排序好顺序)
在最差的情况下,时间复杂度为:O(n ^ 2)。它是一种不稳定的插入排序。