四 希爾排序

2021-10-10 01:09:57 字數 1398 閱讀 5592

希爾排序是一種基於插入排序的快速的排序演算法,對於大規模亂序陣列插入排序很慢,因為它之後交換相鄰的元素,因此元素只能一點一點地從陣列的一端移動到另外一端。希爾排序為了加快速度簡單地改進了插入排序,交換不相鄰的元素對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序。

希爾排序的思想是使陣列中任意間隔為 h 的元素都是有序的,這樣的陣列被稱為 h 有序陣列。在進行排序的時候,如果 h 很大,我們就能將元素移動到很遠的地方,為實現更好的 h 有序創造方便。我們這裡使用的是 n/3 開始遞減到 1 的遞增序列。sort 方法的大體邏輯與插入排序相同,但在外面加入一層 while 迴圈,迴圈變數 h 每次除以三,與前面對應。

/**

* 希爾排序

*/public

class

shell

while

(h >=1)

} h /=3;

}}private

static

boolean

less

(comparable v,comparable w)

private

static

void

exchange

(comparable[

] a,

int i,

int j)

private

static

void

show

(comparable[

] a)

system.out.

println()

;}/** * 測試陣列元素是否有序

* @param a

* @return

*/public

static

boolean

issorted

(comparable[

] a)

}return

true;}

}

希爾排序是一種在實際應用中都十分常見的演算法,因為對於中等大小的陣列它的執行時間是可以接受的,它的**量很小,而且不需要使用額外的記憶體空間。更加高效的演算法確實也有,但他們可能只會比希爾排序快兩倍(甚至可能還不到),而且更加複雜。如果你需要解決乙個排序問題而又沒有系統排序函式可以用,可以先用希爾排序,然後再考慮是否值得將它替換成更加複雜的排序演算法。

空間複雜度:只是用了2個迴圈變數以及1到2個標誌和交換等的中間變數,這個與待排序的記錄個數無關,空間複雜度為 o(1)。

穩定性:不穩定的,雖然插入排序是穩定的,但是希爾排序在插入的時候是跳躍性插入的,有可能破壞穩定性。例如 7 5 5 8,當 i = 2時,分成兩組 [7 5],[5 8]。分別使用插入排序後,第一組為 [5 7],第二組為 [5 8]。 合併後可以發現,兩個 5(相同元素)的相對位置發生了改變。

排序四 希爾排序

時間複雜度 最好 o n o nlogn 平均o n depends on gap 最差o n o n 空間複雜度 o n o 1 穩定性 不穩定 定義乙個間隔增量gap,gap小於待排序序列長度。根據增量gap將待排序序列進行分組,對每一組進行簡單插入排序。gap減小。若gap 1則繼續執行步驟1...

排序演算法 四 希爾排序

希爾排序是插入排序的一種優化實現,比直接插入排序演算法更高效。也是第一批演算法時間複雜度突破o n 2 的演算法之一。因 d.l.shell 於 1959 年提出而得名。希爾排序是把集合資料按下標的一定增量分組,對每組使用直接插入排序演算法排序 隨著增量的減少,集合資料越來越接近整體有序。當增量減至...

排序演算法總結(四)希爾排序

希爾排序又稱縮小增量排序,是插入排序的一種。它的基本思想是先將整個待排記錄序列分割成若干個子串行,然後對這若干個子串行分別進行直接插入排序,等到待排序列基本有序時,再對整個序列進行直接插入排序。比如如下陣列,先已step 5進行分割。49,38,65,97,76,13,27,49,55,4 由於st...