希爾排序是插入排序的一種比較高階的變形。基本思路還是分治。顯然,對於乙個給定的順序表,如果順序表已經處於乙個「相對有序」的狀態時,插入排序進行的比較和移動次數都會有所減少。而對於較短的序列,常規的插入排序效率可以接受。因此可以考慮將序列分為幾個不同的子串行,分別進行插入排序後再合併。當順序表達到了一種比較令人滿意的「相對有序」狀態時,在進行一次常規的插入排序,就能比較高效地得到排序結果。(當然這個高效不是那麼顯然)
希爾排序最大的特點就是有乙個增量序列dlta[k],序列中的元素是不同的增量值,這些值的基本要求是必須是互質的遞減序列,而且最後乙個增量值必須為1(因為要保證絕對正確的排序結果)。這個序列的選取相對比較自由,當然感覺上按照序列長度的對數來選擇比較靠譜。
舉個簡單的例子。給定乙個長度為6的序列,第一趟選取增量3,得到的子串行為,,。分別進行插入排序後的結果是。這裡注意一點就是子串行在排序的時候,所用的下標依然是原序列的下標,否則進行完一趟子串行的排序後沒有辦法進行合併。(我之前的困惑就在於合併這個步驟)。可以看到這個新得到的中間序列的「相對有序」程度已經比之前的要好一些了。接下來可以選擇增量為2再進行一次上面的過程。最後再進行一次整個序列的普通插入排序即可得到結果。
//希爾排序
//lovesunmoonlight
#include#include#include#define max 10
using namespace std;
typedef structnode;
typedef structlist;
//帶增量的插入排序
void shellinsert(list& s,int dk){
for(int i=dk+1;i0&&s.r[0].key
希爾排序的簡單實現
希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因dl shell於1959年提出而得名。既然是插入排序的改進版本,我們就先來看一看插入排序。插入排序的原理就和打牌時我們抓牌一樣,每次摸到一張新的牌,我...
希爾排序實現
希爾排序算是插入排序的一種高階進化版,雖然希爾排序的實現比較簡單,但是它的原理證明非常複雜,由於能力有限,故沒有涉及。我直接上 吧。include intcontainer 1000001 int main void int increment,temp for increment n 2 incr...
C 實現簡單的希爾排序Shell Sort例項
include using namespace std void shellsort int iarray,int length i while isswap true 如果進行了交換說明 增量為jump的序列 可能存在不是有序的 程式設計客棧在檢測一遍 否則說明增量為jump的序列是有序的 int...