【6】演算法排序(希爾排序)
阿新 • • 發佈:2020-08-28
希爾排序的具體實現思路是:先將整個記錄表分割成若干部分,分別進行直接插入排序,然後再對整個記錄表進行一次直接插入排序。、
總結 : 不斷縮小增量(gap)的排序過程
#include <stdio.h> void PrintSort(int * a, int n) { int i; for (i=0; i<n; i++) { printf("%d ", a[i]); } printf("\n\n"); } void ShellSort(int * a, int n) {// 設定間距 int gap = n/2; while(gap > 0) { int i, j, key; // 每一趟採用插入排序 // i=gap, 從第二個元素往前比較 i++, 比較完第一組進行第二組比較 for(i=gap; i<n; i++) { key=a[i]; // j-=gap 步長 for(j=i; j>=gap && key<a[j-gap]; j-=gap) { a[j] = a[j-gap]; } a[j] = key; } // 新的一輪,開始 gap = gap/2; } printf("希爾排序:\n"); PrintSort(a, 10); }void InsertSort(int * a, int n) { int i, j, tmp; for(i=1; i<n; i++) { tmp = a[i]; for(j=i; j>=1 && tmp<a[j-1]; j--) { a[j] = a[j-1]; } a[j] = tmp; } printf("直接插入排序:\n"); PrintSort(a, 10); } int main() { int b[10] = {10, 3, 20, 4, 30, 5, 40, 6, 2, 1}; InsertSort(b, 10); int a[10] = {10, 3, 20, 4, 30, 5, 40, 6, 2, 1}; ShellSort(a, 10); }