排序之希爾排序

2021-10-04 18:42:18 字數 1140 閱讀 4004

希爾排序對要排序的數字進行分組,在組內進行排序。排序完成需要進行多次分組,每次分組的個數是前一次分組個數的一半。

以 [3  2  9  0  6  1  5  4  8  7] 該陣列為例從小到大進行排序。

1. 首先將該組數字進行分組,首次分組的個數為陣列長度除以2,即 10 / 2 = 5 組,下面相同顏色的為一組(即同一組內數字之間的下標的距離為組的個數)。

2. 將數字在各自組內進行排序,得到下面的結果

3.排序之後再次進行分組,分組的個數為前一次分組個數除以 2,即5 / 2 = 2組 (結果不為整數便向下取整)

4. 將數字在各自組內進行排序,得到下面的結果

5. 再次進行分組,分組的個數為前一次分組個數除以 2,即2 / 2 = 1組,分組個數為1也就是整個陣列。對整個陣列排序之後便得到最終的排序結果。

從以上步驟可以看出,採用希爾排序也就是把整個陣列分成若干組,然後在組內進行排序。隨著分組數目減小直到變為1時,便是對整個陣列排序,也是該步驟後得到最後的排序結果。當然組內的排序可以使用交換法,或者插入法等。

希爾排序的出現主要是為了解決插入排序的缺陷,當使用插入排序時(從小到大排序),如果在一組數字中,小的數字都相對靠右邊,這無疑增加了比較和移位的次數,使得耗費時間增加。從上述圖示步驟中可以看出,採用希爾排序可以盡早的將靠在右邊的小的數字挪到前面,這樣可以極大的提高插入排序的效率。希爾排序主要還是搭配插入法來完成排序。

public static void shellsort(int array) }}

}}

public static void shellsort2(int array) 

array[compareindex + step] = insertvalue;}}

}

排序之希爾排序

提到希爾排序,我們得先來看看插入排序,因為希爾排序本身就是對插入排序的一種優化。插入排序的基本思想 每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的一組元素的合適位置上去,直到元素全部插完為止。就像我們玩鬥地主一樣,接牌的時候,其實就是一種插入排序,每接一張牌,就會把牌放在自己手牌...

排序之希爾排序

希爾排序法又稱縮小增量法。基本思想 先選定乙個整數,把待排序檔案中所有元素分成個n組。所有元素為n的記錄分在同一組內,並對每一組內的記錄進行排序。取重複上述分組和排序的工作。當到達 1時,所有元素在統一組內排好序。實現 void insertsortwithgap int a,int size,in...

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...