Shell排序(改良的插入排序)

2022-02-02 17:54:12 字數 1429 閱讀 5120

shell排序演算法最初是由d.l shell於2023年提出,假設要排序的元素有n個,則每個進行插入排序是並不是所偶的元素同時進行,而是去一段間隔。

shell首先將間隔設定為n/2,然後跳躍的進行插入排序,再來將間隔設定為n/4,跳躍進行排序動作,再來設定時間間隔為n/8、n/16,知道間隔為1之後的最後一次排序終止,由於上一次的排序動作都會將固定間隔內的元素排序好,所以當間隔為1之後的最後一次排序終止,由於上一次的排序動作都會將固定間隔內的元素排序好,所以當間隔越來越小時,某些元素位於正確位置的機率越高,因此最後幾次的排序動作將可以大幅減低。

舉個例子來說,假如有一未排序的數字如右:89 12 65 97 61 81 27 2 61 98

數字的總數共有10個,所以第一次我們將間隔設定為10/2=5,此時我們對間隔為5的數字進行排序,如下所示:

總結連線的部分表示要一起進行排序的部分,再來將間隔設定為5/2的商,也就是2,則第二次的插入排序物件如下所示:

再來間隔設定為2/2=1,此時就是單純的插入排序了,由於大部分的元素都已大致排序過了,所以最後一次的插入排序機會沒有什麼排序動作了:

將間隔設定為n/2是d.l shell最初所提出,在教科書中使用這個間隔比較好說明,然而shell排序法的關鍵在於間隔的設定,例如sedgewick證明選用以下的間隔可以加快shell排序演算法的速度:

其中4*(2j)2 + 3*(2j) + 1不可超過元素總數n值,使用上式找出j後代入4*(2j)2 + 3*(2j) + 1求得第乙個間隔,然後將2j除以2代入求得第二個間隔,再來依次類推。

後來還有人證明有其它的間隔選定方法可以將shell排序演算法的速度再加快;另外shell排序演算法的概念也可以用來改良氣泡排序演算法。

c#例項:

private static void shellsort()

;int length = num.length;

int gap = length / 2;

writenumline(num);

while (gap > 0)

else}}

}gap = gap / 2;

writenumline(num);

}writenumline(num);

}private static void writenumline(int num)

console.writeline();

}

改良插入排序

說明 插入排序法由未排序的後半部分前端取出乙個值,插入已排序前半部分的適當位置,概念簡單但速度不快。排序要加快的基本原則之一,是讓後一次的排序進行時,盡量利用前一次排序後的結果,以加快排序的速度,shell排序法即是基於此一概念來改良 插入排序法。解法 略 include include inclu...

改良版插入排序

我們來看一下插入排序定義 插入排序是由未排序的後半部前端取出乙個值,插入已排序前半部的適當位置,概念簡單但速度不快。改良版的插入排序是讓後一次的排序進行時,盡量利用前一次排序後的結果,以加快排序的速度,shell排序法即是基於此概念來改良插入排序法。解法 假設要排序的元素有n個,則每次進行插入排序時...

插入排序 shell排序

shell排序 這個系列是回顧之前所學,是用python商量著完成的。路過的大佬就當看個樂,實現演算法的方式不一,也有討巧的做法。我只講講我的思路,希望大家瀏覽的時候能多多提建議,共同學習共同進步。shell排序基本思想 shell是插入排序的一種高效改進版本,shell排序是不穩定排序演算法,該演...