基本思路:
先把数组分成差量为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; }