基本思路:
1)将数组按照一个固定的增量分成若干部分,然后按照相隔的增量的元素进行直接插入排序。
2)递减增量的值,继续进行插入排序。
3)直到值为1时,进行最后一次直接插入排序。
#include <stdio.h>
#define N 9
void shellsort(int a[], int n);
void swap(int *x, int *y);
void printarr(int a[], int n);
void shellsort(int a[], int n){
int i, j, gap;
for(gap = n/2; gap>0; gap /= 2){
for(i=gap; i<n; i++){
for(j=i; j>0 && a[j]<a[j-gap]; j -= gap){
swap(&a[j], &a[j-gap]);
}
}
}
}
void swap(int *x, int *y){
int i = *x;
*x = *y;
*y = i;
}
void printarr(int a[], int n){
int i;
for(i=0; i<n; i++){
printf("%d ", a[i]);
}
printf("\n");
}
int main(void){
int a[N] = {2, 5, 3, 1, 8, 12, 15, 9, 18};
shellsort(a, N);
printarr(a, N);
return 0;
}