本文將介紹排序演算法中的希爾排序,它是高階版的插入排序,是我們第乙個介紹的有點難度的演算法。希爾排序,是插入排序的乙個公升級版本。在插入排序中,無論資料是怎麼分布的,依然循規蹈矩的一步一步比較,移動,插入。在希爾排序中,採用跳躍式的方式,按照某個增量gap將陣列元素分成多組序列,並使用插入排序使得各自組內有序。隨後逐步縮小gap,繼續按組進行插入排序,直到增量為1。這樣做的目的是使得陣列整體在巨集觀上有序,最終只需要微調區域性元素就可以完成排序。
我們有初始陣列[4,5,1,10,3,6,9,2]。
第一趟:gap=4(一般初始化為陣列長度/2),表示相隔4個位置的元素為一組。此時,a[0]和a[4]、a[1]和a[5]、a[2]和a[6]、a[3]和a[7]為一組,共4組。這一趟的任務就是讓這4組元素在組內是有序的。
第二趟:gap=2(每次除以2),表示相隔2個位置的元素為一組。a[0]、a[2]、a[4]、a[6]為一組,a[1]、a[3]、a[5]、a[7]為一組。同樣,讓這兩組元素在組內有序。
第三趟:gap=1,也是最後一趟,表示每隔1個位置的元素為一組,也就是整個陣列了。讓整個陣列有序。
經過了前面兩次的「巨集觀調控」,整個陣列已經基本有序,只需要對部分元素進行微調,不會出現對整個陣列進行移動的情況。
從13行到第22行,就是希爾排序的核心。
13行:定義了gap變數,初始化為n/2,每次迴圈結束後都會除以2,直到gap=1。
15-21行:其實就是插入排序,插入只不過在希爾排序中,j的前乙個元素不是j-1,而是j-gap。
如果插入排序不了解的,可以檢視往期文章【排序演算法之插入排序,玩撲克牌必會】
希爾排序的分析是乙個複雜的問題,它時間複雜度依賴於增量序列,用不同的增量序列,能夠得到不一樣的時間複雜度。其中o(n^1.3)是乙個比較好的實現。最壞時能夠達到o(n^2)
希爾排序的增量怎麼算 排序演算法之希爾排序
希爾排序是希爾 donald shell 於1959年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破o n2 的第一批演算法之一。簡單插入排序很循規蹈矩,不管陣列分布是怎麼樣的,依然一步一步的對元素進行比較,移動...
排序演算法(四) 希爾排序 增量排序
希爾排序思想 將現有資料分為d個組,在每個分組內使用直接插入排序演算法,使得整個資料段越來越有序。接著繼續將資料分組並使用直接插入排序 分組會越來越小 直到分組為1。每個分組數一般互質 時間複雜度 o n 1.3 1.5 空間複雜度 o 1 穩定性 不穩定 void shell int arr,in...
排序五之希爾排序(縮小增量排序)
shell sort 氣泡排序演算法,選擇排序演算法和插入排序演算法的思路比較直觀,但排序的效率都比較低。對於遇到大量的資料需要排序時,shell排序便是其他更為高效的演算法之一。sell排序演算法嚴格來說基於插入排序的思想,又稱希爾排序或縮小增量排序。shell排序的基本流程如下 1 將有n個元素...