基本思路:
先把数组分成差量为d 的几组,即:
a[1],a[1+d] ,a[1+d+d] ... 为一组;
a[2],a[2+d] ,a[2+d+d] ... 为一组;
然后依次对每组进行插入排序。
各组排完序后 在 取第二个增量d2 < d 重复上述 分组和排序。
直到 增量 d = 1; 即 所有的数都放在同一组中进行插入排序。
下面是 c语言实现
#include <stdio.h>
void shellInsertSort(int a[] ,int n){
int i,j,d;
d = n/2;
while(d>=1){
for(i = d+1 ;i<=n ;i++){
j = i-d;
while(j>0){
if(a[j]>a[j+d]){
a[0] = a[j];
a[j] = a[j+d];
a[j+d] = a[0];
j = j-d;
}else{
j = 0;
}
}
}
d=d/2;
}
}
void shellSortPass(int a[],int d){
for(int i = d+1 ;i<=8 ;i++){
if(a[i]<a[i-d]){
a[0] = a[i];
int j = i-d;
do{
a[j+d] = a[j];
j = j-d;
}while(j>0&&a[0]<a[j]);
a[j+d] = a[0];
}
}
}
void shellSort(int a[]){
int d = 8;
do{
d = d/2;
shellSortPass(a,d);
}while(d>1);
}
void print(int a[] ,int n)
{
for (int i = 1;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main(int argc, char *argv[])
{
int a[]=
{
0,59,48,75,98,86,23,37,60
};
print(a,9);
shellSort(a);
//shellInsertSort(a,9);
print(a,9);
return 0;
}