排序算法之希爾排序

希爾排序

希爾排序是優化後的插入排序,又名玄學排序,因爲希爾排序是不穩定的。希爾排序就是將一個數組分成間隔爲h的子數組,並對這些子數組進行插入排序,通過不斷地縮小h的值,從而滿足插入排序適合的情形:數組基本有序,從而達到良好的性能。

難點

希爾排序的難點在於遞增序列的選擇,我使用的是《算法(第四版)》中推薦的遞增序列,即1/2(3k-1),從N/3開始遞減至1。

演示

動圖演示

代碼實現

希爾排序的代碼與插入排序相似,只是增加了一個增量h

        int N = t.length;
        int h = 1;
        while (h < N / 3) {
            h = 3 * h + 1;
        }
        while (h >=1) {
            for (int i = h; i < t.length; i++) {
                int key = t[i];
                int j = i - h;
                while (j >= 0 && t[j] > key) {
                    t[j + h] = t[j];
                    j -= h;
                }
                t[j + h] = key;
            }
            h /= 3;
        }

總結

通過對希爾排序運行時間的測試,發現希爾排序比插入排序和選擇排序要快很多,尤其是數組越大的時候。希爾排序最壞運行時間爲O(n2),最好運行時間爲O(n),平均運行時間爲O(n1.3)。有經驗的程序員有時會用到希爾排序,因爲對於中等大小的數組,它的運行時間是可以被接受的,並且不佔用額外的空間。

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