#include <stdio.h> #include <stdlib.h> #define NUM 10 #define filename "test.txt" #define mode "r" void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp; } /* * 步长为1、3、10 ...,迭代公式为 gap = gap*3+1 * */ void ShellSort(int *a, int n){ int gap = 0; int i,j,tmp; if(n<1) return; //取得最大步长 while(gap*3+1 <=n){ gap = gap*3+1; } while(gap >0){ /* * 对前gap个元素,步长为gap组成的序列进行排序 * gap从最大的开始,最大不超过数组长度n,最后一次必须为1 * 即最后一次为插入排序,保证数组肯定有序 */ for(i=0;i<gap;++i){ for(j=i+gap;j<n;j+=gap){ //因为j需要往前回溯,所以用tmp记录当前j的位置 tmp = j; while(j-gap >=0 && a[j] <a[j-gap]){ swap(a+j, a+j-gap); j -= gap; } j = tmp; } } //缩小步长 gap = (gap-1)/3; } } int main(){ int a[NUM] = {0}; int i; FILE *file = NULL; file = fopen(filename, mode); if(file == NULL) exit(1); while(fscanf(file, "%d", a) != EOF){ for(i=1;i<NUM;++i){ fscanf(file, "%d", a+i); } ShellSort(a, NUM); for(i=0;i<NUM;++i) printf("%d ", a[i]); printf("/n/n"); } fclose(file); file = NULL; exit(0); }