希尔排序是按照不同步长对元素进行插入排序,实质就是把一组元素分为很多小组各自进行排序。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,分别进行直接插入排序,然后元素的分隔逐渐减少,当增量足够小(即为1时),再对全体元素进行一次插入排序,因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序时间效率比较高。
这里用下别人的图
以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例
第一次 gap = 10 / 2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
这里就分了5组,每组都进行一次插入排序,完成之后,改变间距第二次 gap = 5 / 2 = 2
排序后
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
如图分为两组,再次进行插入排序,然后继续减小间距,知道间距为1,所以希尔排序就是把直接插入排序用了多回的算法 ,代码如下void ShellSort(int a[],int N)//N是待排元素个数
{
int tmp,i;
for(int gap=N/2;gap>0;gap/=2)//希尔排序增量
for(int j=gap;j<N;j++)//各组元素交替插入排序
{ tmp=a[j];
for(i=j;i>=gap&&a[i-gap]>tmp;i-=gap)
a[i]=a[i-gap];
a[i]=tmp;
}
}
希尔排序平均时间复杂度为O(n(1.3)),最好是O(n),最坏情况O(n(2)),并且是不稳定的