1. 程式人生 > 實用技巧 >希爾排序(Shell Sort)

希爾排序(Shell Sort)

希爾排序(Shell Sort)

先追求表中的部分元素有序,再逐漸逼近全域性有序

定義和操作步驟

先將待排序表分割成若干行形如L[i,i+d,i+2d,...,i+kd]的“特殊”子表,對各個子表分別進行直接插入排序。縮小增量d,重複上述過程,直到d=1為止

把相對的位置的大小順序不對的對調。

第二趟把增量d縮小,對每個子表進行直接插入排序

第三趟的時候,d已經變成1了,相當於對錶進行操作。

整個表已呈現出“基本有序”,對整體在進行一次“直接插入排序”

考試中可能會遇到各種增量。判斷當時序列的狀態。

程式碼

//希爾排序
void ShellSort(int A[],int n){
    int d,i,j;
    //A[0]只是暫存單元,不是哨兵,當j<=0時,插入位置已到
    for(d=n/2;d>=1;d=d/2)		//步長變化
        for(i=d+1;i<=n;++i)
            if(A[i]<A[i-d]){	//需將A[i]插入有序增量子表
                A[0]=A[i];		//暫存在A[0]
                for(j=i-d;j>0&&A[0]<A[j];j-=d)
                    A[j+d]=A[j];//記錄後移,查詢插入的位置
                A[j+d]=A[0];	//插入
            }
}

嘗試實現直接處理完一個子表的

演算法效能分析

空間複雜度:O(1)

時間複雜度:和增量序列d1,。。。的選擇有關,目前無法用數學手段證明確切的時間複雜度

最壞時間複雜度為O(n^2),當n在某個範圍內時,可以達到O(n^1.3)

穩定性

不穩定。

適用性:僅適用於順序表,不適用於連結串列

知識回顧