希尔排序
如图: 我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。
图中有10个数,所以第一趟增量就设为10/2=5;看图中第一趟排序,颜色相同为一组,每组进行比较,可以看到,这十个数被分成了五组 [9,4] [1,8] [2,6] [5,3] [7,5], 然后对这五组分别进行直接插入排序
第二趟继续进行,缩小增量为5/2=2;这时候可以看到这些数被分成了两组[4,2,5,8,5] [1,3,9,6,7],继续分别对这两组进行直接插入排序。
第三趟 缩小增量为 2/2=1;这时候,只需要对这些数字进行微调就可以满足要求。
希尔排序的代码部分:(C语言版)
#include
int main(){
int i=0,gap=0,k=0,j=0,t=0;
int n=0;
scanf("%d",&n);
int a[n];
for(i=0;i0;gap=gap/2){ //设置增量,每次都是gap/2;
for(k=gap;k<10;k++){
t=a[k]; //将要插入的数放入t中
j=k-gap;
while(j>=0&&t
总结:
我们上面选择的增量序列{n/2,(n/2)/2...1}(希尔增量),其最坏时间复杂度依然为O(n2),一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n3/2)。