希爾排序(shell sort)是插入排序
的一種。也稱縮小增量
我們分割待排序記錄的目的是減少待排序記錄的個數,並使整個序列向基本有序發展。而如上面這樣分完組後,就各自排序的方法達不到我們的要求。因此,我們需要採取跳躍分割的策略:將相距某個「增量」的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。
操作流程圖:
操作步驟:
初始時,有乙個大小為 10 的無序序列。
(1)在第一趟排序中,我們不妨設 gap1 = n / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。
(2)接下來,按照直接插入排序的方法對每個組進行排序。
在第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數)。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。
(3)按照直接插入排序的方法對每個組進行排序。
(4)在第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。
(5)按照直接插入排序的方法對每個組進行排序。此時,排序已經結束。
// 希爾排序
public static void shellsort(inta)
a[j+ d] = temp;}}
if (d== 1) }}
演算法效能:
時間複雜度:最好情況:由於希爾排序的好壞和步長gap的選擇有很多關係,因此,目前還沒有得出最好的步長如何選擇(現在有些比較好的選擇了,但不確定是否是最好的)。所以,不知道最好的情況下的演算法時間複雜度。
最壞情況下:o(n*logn),最壞的情況下和平均情況下差不多。
已知的最好步長序列是由sedgewick提出的(1, 5, 19, 41, 109,...)。
這項研究也表明「比較在希爾排序中是最主要的操作,而不是交換。」用這樣步長序列的希爾排序比插入排序和堆排序都要快,甚至在小陣列中比快速排序還快,但是在涉及大量資料時希爾排序還是比快速排序慢。
空間複雜度
由直接插入排序演算法可知,我們在排序過程中,需要乙個臨時變數儲存要插入的值,所以空間複雜度為1。
演算法穩定性
希爾排序中相等資料可能會交換位置,所以希爾排序是不穩定的演算法。
排序演算法 詳解希爾排序演算法
希爾排序實際上是一種插入排序的優化,希爾排序的目的是先進行預排序,使陣列更加的有序,將需要排序的陣列分成n gap個大小為gap的子陣列,對子樹組進行插入排序。當gap等於1時,就相當於直接插入排序了。例如 9 8 7 6 5 4 3 2 1 排公升序 直接插入排序需要 45次 用希爾排序 時間複雜...
希爾排序詳解
基本概念 希爾排序按其設計者希爾 donald shell 的名字命名,它是一種基於插入排序的快速排序演算法,要了解希爾排序,必須先掌握插入排序的原理與實現。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步...
希爾排序詳解
基本概念 希爾排序按其設計者希爾 donald shell 的名字命名,它是一種基於插入排序的快速排序演算法,要了解希爾排序,必須先掌握插入排序的原理與實現。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步...