希爾排序

希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminshing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1959年提出而得名。
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

#include <stdlib.h>

#include <stdio.h>
#define SWAP(x,y,t) t=x;x=y;y=t;
void print(int arr[],int n) {
    for (int i = 0; i <n; i++) {
        printf("%6d", arr[i]);
    }
    printf("\n");
}


int callInc(int dk){
    return dk/3+1;//計算增值量,遞減
}

void shellInsertSort(int arr[],int n,int dk){
    int j;
    for(int i=dk+1;i<n;i++){
        if(arr[i]<arr[i-dk]){
           int tmp=arr[i];
            for(j=i-dk;j>=0&&tmp<arr[j];j=j-dk){//後移
                arr[j+dk]=arr[j];
            }
            arr[j+dk]=tmp;//插入位置
        }
    }
    if(dk>1){
        shellInsertSort(arr,n,callInc(dk));
    }else{
        print(arr,n);
    }
}


//希爾排序
void shellSort(int arr[],int n){
    shellInsertSort(arr,n,callInc(n));

}
int main(){
    int a[]= { 2,5,3,0,2,3,0,-1,5,6,-2,4,5};
    shellSort(a,sizeof(a)/sizeof(int));
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章