演算法 希爾排序

2021-08-27 16:08:06 字數 1411 閱讀 5361

對於大規模亂序陣列插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點地從陣列的一端移動到另一端。例如,如果主鍵最小的元素正好在陣列的盡頭,要將它挪到正確的位置就需要 n-1 次移動。希爾排序為了加快速度簡單地改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序。

基本思想:

先取乙個小於陣列長度n的整數h作為第乙個增量,把陣列的全部元素分組。所有距離為h的倍數的元素放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量h(小於第乙個增量h)重複上述的分組和排序,直至所取的增量h=1,即所有元素放在同一組中進行直接插入排序為止。

該方法實質上是基於插入演算法的一種分組插入方法。

比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。

d.l.shell於2023年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量h分成若干組,每組中元素的下標相差h.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

演算法的效能與h的選擇有關,但是h的選擇仍然是數學的前沿研究問題,沒有定論,我們只能根據我們的經驗和需要來選取適合的h。

穩定性:

由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

複雜度:

希爾排序的時間複雜度與增量序列的選取有關,例如希爾增量時間複雜度為o(n²),而hibbard增量的希爾排序的時間複雜度為o(n的3/2次方),希爾排序時間複雜度的下界是n*log2n。

空間複雜度為o(1)。

**實現:

public class test }}

system.out.println("第" + count + "趟排序");

system.out.println(arrays.tostring(numbers));

h = h/3;//重新選取h

} }public static void main(string args) ;

system.out.println("排序前:");

system.out.println(arrays.tostring(numbers));

sort(numbers);

}}

執行結果:

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...

排序演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...