算法原理:需要一个增量序列,即1...n/4、n/2,增量序列可以以n/2为开始,每次的增量等于上一次增量除以2,n是元素个数。每次排序以同一增量的元素为子序列,对每个子序列进行插入排序,直至增量d为1时,整个序列已经基本有序,再对序列进行d=1的希尔排序,此时相当于对整个序列进行直接插入排序。
以下为模拟排序图:
代码如下:
#include <stdio.h>
//希尔排序
void shellsort(int a[],int n);
int main ()
{
int a[11]={6,1,2,7,12,8,5,4,3,9,15};
shellsort(a,11);
return 0;
}
void shellsort(int a[],int n){
for(int d=n/2;d>0;d/=2){
for(int i=d;i<n;i++){//注意这里用的是i++,不是i+=d,因为是轮流对每组元素的第一个无序
int key=a[i]; //元素做直接插入排序
int j=i;
for(;j>=d&&key<a[j-d];j-=d){
a[j]=a[j-d];
}
a[j]=key;
}
}
for(int i=0;i<n;i++){
printf("%d",a[i]);
if(i!=n-1){
printf(" ");
}
}
}