排序4 插入排序(希爾排序)

2021-06-25 23:23:31 字數 2086 閱讀 2250

從前面的介紹可以看到,一般情況下,對於同一序列的排序,儘管在實際的操作次數上我們進行了不斷的改進,但是,仍然無法改變其時間複雜度為o(

n2)的事實,因此,當序列元素個數n變得越來越大時,之前所介紹的排序演算法在效能上的改進也將顯得無力。在插入排序中,有種排序或許能在n比較大的時候,在效能上有較好的表現,這就是接下來要介紹的希爾排序。

我們知道,直接插入排序的最好情況是序列完全順序,初始序列越接近完全順序,排序過程中所要進行的操作次數也就越少。而且顯然,序列元素個數越少,效能也就相對越好。希爾排序正是基於這兩個事實而來的,其核心思想是:把完整的序列按一定的增量分割成若干部分,每部分的元素個數相對較少。然後各個部分進行直接插入排序,從而得到了部分有序的結果。各部分重新合為完整的序列,這個完整序列比初始的序列顯得更有序了。然後再調整增量,重複上述步驟。這樣一來,先前得到的部分有序的結果將被後續的步驟所利用、整合,從而後續步驟中進行直接插入排序的各個部分將能大大減少操作次數。到這裡,讀者可能覺得挺抽象,下面來個例子讓大家更好理解理解。

設序列:49、38、65、97、76、13、27、

49、55、4。讓我們以增量5來分割序列,將會得到如下的若干部分:49、13;38、27;65、

49;97、55;76、4。對這幾個部分分別進行直接插入排序,將得到:13、49;27、38;

49、65;55、97;4、76,由此,整個序列現在變為:13、27、

49、55、4、49、38、65、97、76。

可以發現,通過上面的步驟,整個序列現在比原來變得更有序了,因為每個被分割出來的部分都已有序。接著,我們再以3為增量,分割現在的整個序列,得到:13、55、38、76;27、4、65;

49、49、97。對這幾個部分進行直接插入排序,得:13、38、55、76;4、27、65;

49、49、97,完整序列變為:13、4、

49、38、27、49、55、65、97、76。可知,又比上一回的排序結果更有序,原因就在於縮小了增量,使得更頻密的被分割部分都已有序。最後,以1為增量分割現在的整個序列,再重複上述。而顯然,增量為1分割序列的結果就是整個序列本身,最後的步驟實際上就是對當前的完整序列再總體進行一回直接插入排序。最終得:4、13、27、38、

49、49、55、65、76、97。

相信通過上面的例子,讀者能體會到希爾排序的思想和好處。此處,讀者會提出個問題:增量應該怎樣設定?對於這個問題,連計算機科學家目前也暫時無法明確回答。有人提出,增量序列為delta,delta[i]=pow(2,times-i+1)

-1,times 為所需排序的趟數,且應有:1≤i

≤times≤⌊

log2

(n+1)

⌋,這裡n為序列元素個數。無論如何,增量序列裡頭所有增量的公因子都應該只有1,至於原因,可見上例,若開頭選取增量4,則有:49、76、55;38、13、4;65、27;97、

49。此趟排序後有:49、4、27、

49、55、13、65、97、76、38。然後取增量2,則有:49、27、55、65、76;4、

49、13、97、38。大家可發現,兩趟排序中,49、55、76必定會出現在同一分割部分內,還有其它好幾個元素也有這樣的現象。這意味著,第2趟排序中,這幾個元素也要進行相應的操作,而在第1趟排序後,它們就已經相互間有序了,這樣的重複操作顯然會帶來效能上的損失。最後,增量1必定要作為最後一趟排序的增量。

從上文可看出,希爾排序是不穩定排序。**如下:

#include /*

開頭有可能我們不會寫出shellsortkernel,直接寫shellsort。這樣會造成delta需要用陣列存起來,

而delta陣列的元素個數與序列元素個數有關,使得空間複雜度上公升。

通過呼叫shellsortkernel,使得整個排序過程中不再同時產生與序列元素個數有關的輔助空間。

*/void shellsortkernel(int list,int length,int delta)

{ for(int from=0;from=from)&&(temp由此,

時間複雜度的分析也就無法予以嚴格的數學推導。

大量的實驗表明,上文提到的確定增量的方法能使時間複雜度大致為o(

n1.5

)。由於演算法沒有使用隨序列元素個數變化而改變量量的

輔助儲存空間,則空間複雜度為o(1)。

排序演算法 4 希爾排序 插入排序

希爾排序法又稱縮小增量法。利用越有序,插排效率越大的特性,再進行插排之前進行預排序,讓數列盡可能的有序,希爾排序法的基本思想是 即對陣列元素依次進行分組插排,一般將增量選擇為d1 size 3 1,這個由經驗得出 下圖很好的闡述了希爾排序的思想,也有詳細排序過程 希爾排序 遞增 void shell...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...

排序 插入排序,希爾排序

基本思想 每一步將乙個待排序的元素,按其排序碼的大小,插入到前面已經排好序的序列的合適位置上,直到元素全部插入完畢。直接插入排序 空間複雜度 o 1 時間複雜度 o n n 穩定性 穩定 使用場景 對於一組有序的序列,想插入乙個資料。插入排序的優化 使用二分查詢找到合適的插入位置 折半插入排序 vo...