排序 三 之希爾排序

2021-09-29 04:28:13 字數 834 閱讀 1499

插入排序乙個很明顯的缺點是插入元素時需要與已經排序的元素進行對比,對比的次數可能會比較多,考慮最壞的情況,如果原始的陣列是倒序的,每插入乙個元素時都要跟所有已經排好序的元素進行對比,演算法的效率很低。

但是如果插入元素時對比的次數較少,能夠大大提高演算法的效率,希爾排序就是通過將元素陣列劃分為若干小組,然後對各個小組進行插入排序來減低元素之間對比的次數,提高排序的效率。

希爾排序首先選擇乙個元素選擇步長將陣列劃分為若干小組,對各個小組分別進行排序,然後不斷將步長縮小,不斷分組和排序,直到後的步長為1,對所有的元素進行排序,此時,經過前期的排序工作,能夠減少全體元素插入排序的對比次數,大大降低了排序的時間複雜度。

1、當step > 2 時,可以自由的選擇步長

/* step > 2 */

intshell_sort

(int

*array,

int length,

int step)

array[j + gap]

= tmp;}}

return0;

}

2、當step = 2 時:

/* step > 2 */

intshell_sort

(int

*array,

int length)

array[j + gap]

= tmp;}}

return0;

}

希爾排序就到這裡了,下一章介紹快速排序。

排序之希爾排序

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

排序之希爾排序

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

排序之希爾排序

希爾排序對要排序的數字進行分組,在組內進行排序。排序完成需要進行多次分組,每次分組的個數是前一次分組個數的一半。以 3 2 9 0 6 1 5 4 8 7 該陣列為例從小到大進行排序。1.首先將該組數字進行分組,首次分組的個數為陣列長度除以2,即 10 2 5 組,下面相同顏色的為一組 即同一組內數...