1. 程式人生 > 實用技巧 >【6】演算法排序(希爾排序)

【6】演算法排序(希爾排序)

希爾排序的具體實現思路是:先將整個記錄表分割成若干部分,分別進行直接插入排序,然後再對整個記錄表進行一次直接插入排序。、

總結 : 不斷縮小增量(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); }