標籤:
shell排序的方法又稱縮小增量法,是對直接插入排序法的改進。至於對於分組後採用哪種排序方法實現,本例採用直接選擇排序和直接插入排序,理論上講,通過分組排序後,資料基本上有序,這時通過直接插入排序會比直接選擇排序好,因為直接選擇排序每一趟排序都必須比較所有的元素。
具體代碼如下:
/* *shell排序*/#include <stdio.h>#define N 10void shellChoice(int *list){ int d=N/2,i,j,k,index;//d為增量 int temp; while(d) //最外層迴圈,用來確定步長的大小 { for(i=0;i<d;i++) //外層迴圈,用來確定要執行多少次直接選擇排序 { for(j=i;j<N;j=j+d) //內層迴圈,分組後的排序,採用直接選擇排序 { index=j; for(k=j;k<N-d;k=k+d) { if(list[index]>list[k+d]) { index=k+d; } } if(j==index) continue; else { temp=list[j]; list[j]=list[index]; list[index]=temp; } } } d=d/2; }}void shellInsert(int *list){ int d,i,j,index;//d為增量 int temp; for(d=N/2;d>0;d=d/2) //最外層迴圈,用來確定增量的多少 { for(i=0;i<d;i++) //外層迴圈,用來確定要執行多少次直接插入排序 { for(j=i;j<N;j=j+d) //內層迴圈,分組後的排序,採用直接插入排序 { temp=list[j]; index=j-d; while(temp<list[index] && index>=0) { list[index+d]=list[index]; index=index-d; } list[index+d]=temp; } } }}void print(int *list){ int i=0; for(i=0;i<N;i++) printf("%d ",list[i]); printf("\n");}int main(void){ int i=0; int a[N]={0}; printf("請輸入10個數\n"); for(i=0;i<N;i++) scanf("%d",&a[i]); printf("排序前\n"); print(a); shellInsert(a); printf("排序後\n"); print(a); return 0;}
用c實現shell排序