排序算法之希爾排序

基本思想

設待排元素序列有n 個,首先取一個整數gap(gap<n) 作爲間隔,將全部元素分爲gap 個子序列,所有距離爲gap 的元素放在同一個子序列中,在每一個子序列中分別進行直接插入排序。然後縮小間隔gap ,重複上述的子序列劃分和排序工作。知道最後gap 等於1時,將所有元素放在同一個序列中排序爲止。
至於gap 的取法有各種方案。最初Shell提出取gap=n/2 ,gap=gap/2 ,直到gap=1 。但由於直到最後一步,在奇數位置的元素纔會與偶數位置的元素進行比較,其效率將很低。後來Knuth 提出取gap=gap/3+1 。還有人提出都取奇數爲好,也有人提出各gap 互質爲好。應用不同的序列會使希爾排序算法的性能有很大的差異。

代碼

//待排數據存儲在數組a中,以及待排序列的左右邊界
public void ShellSort(int[] a, int left, int right) {
    int gap = right - left + 1;//劃分子序列的間距
    do {
        gap = gap / 3 + 1;
        for (int i = left + gap; i <= right; i++) {
            if (a[i] < a[i - gap]) {
                int j = i - gap;
                int temp = a[i];

                do {
                    a[j + gap] = a[j];
                    j = j - gap;
                } while (j >= left && temp < a[j]);

                a[j + gap] = temp;
            }
        }   
    } while (gap > 1);
}

性能分析

  • 時間複雜度
    對希爾排序的時間複雜度的分析很困難,在特定情況下可以準確地估算元素的比較次數和移動次數,但想要弄清楚元素的比較次數和元素移動次數與增量選擇之間的依賴關係,並給出完整的數學分析,還沒有人能夠做到。
    由於即使對於規模較大的序列(n1000 ),希爾排序都具有很高的效率。並且希爾排序算法的代碼簡單,容易執行,所以很多排序應用程序都選用額希爾排序算法。
  • 穩定性
    希爾排序是一種不穩定的排序算法。
發佈了34 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章