大家端午節安康,這兩天都忙著玩了。沒什麼時間寫技術部落格。不過定好的計畫一定要努力完成。
這次給大家介紹一下希爾排序演算法,其實這是建立在插入排序之上的一種排序演算法。當然,作為乙個程式設計師,我們聽到諸如:「建立在xx之上」,「是***的改進版」,「繼***後,***x橫空出世」這些句子,本能會思考舊東西的缺點,新東西的優點,新東西解決了舊東西什麼問題。那麼插入排序有什麼問題呢?
如果仔細看過前面介紹插入排序演算法的小夥伴,肯定知道插入排序是要移動元素的位置,將合適的元素插入至合適的位置。那麼問題就來了,如果要對大量的資料排序,豈不是插入一次,要挪動大量的元素?插入排序在面對大量的資料時,效率十分慢。而希爾排序,就是插入排序的優化版,能在面對大量資料時也保持效率。
希爾排序(shell sort)這個排序方法又稱為縮小增量排序,是2023年d·l·shell提出來的。該方法的基本思想是:設待排序元素序列有n個元素,首先取乙個整數increment(小於n)作為間隔將全部元素分為increment個子序列,所有距離為increment的元素放在同乙個子串行中,在每乙個子串行中分別實行直接插入排序。然後縮小間隔increment,重複上述子串行劃分和排序工作。直到最後取increment=1,將所有元素放在同乙個子串行中排序為止。
由於開始時,increment的取值較大,每個子串行中的元素較少,排序速度較快,到排序後期increment取值逐漸變小,子串行中元素個數逐漸增多,但由於前面工作的基礎,大多數元素已經基本有序,所以排序速度仍然很快。
其實看圖就比看文字更好理解:
假設我們有乙個陣列如下,我們第一次排序時,取間隔為4的數,那麼陣列便分成了下標為04,16,27,3的幾組數,先對這幾組分別排序。排好之後,我們再取間隔為2的數,那麼陣列分成了,0246與1357兩組數,最後我們取間隔為1的數,這相當於一次插入排序。
注意,我們在一開始取間隔取得很大,目的就是做元素之間的快速移動,避免長距離的移動元素,隨著後面間隔越來越小,但因為長距離間隔的元素已經是有序的了,所以不會存在下標第99999的需要插入到下標為2的元素位置上。
這種序列並不是很好的增量序列,使用這個增量序列的時間複雜度(最壞情形)是o(n^2)
hibbard提出了另乙個增量序列,
這種序列的時間複雜度(最壞情形)為o(n^1.5)
sedgewick提出了幾種增量序列,其最壞情形執行時間為o(n^1.3),其中最好的乙個序列是
/**
* 希爾排序
* @param arr 目標序列
*/public
static
void
shellsort
(int
arr)}}
}
排序演算法 四 希爾排序
希爾排序是插入排序的一種優化實現,比直接插入排序演算法更高效。也是第一批演算法時間複雜度突破o n 2 的演算法之一。因 d.l.shell 於 1959 年提出而得名。希爾排序是把集合資料按下標的一定增量分組,對每組使用直接插入排序演算法排序 隨著增量的減少,集合資料越來越接近整體有序。當增量減至...
排序演算法總結(四)希爾排序
希爾排序又稱縮小增量排序,是插入排序的一種。它的基本思想是先將整個待排記錄序列分割成若干個子串行,然後對這若干個子串行分別進行直接插入排序,等到待排序列基本有序時,再對整個序列進行直接插入排序。比如如下陣列,先已step 5進行分割。49,38,65,97,76,13,27,49,55,4 由於st...
整理排序演算法(四) 希爾排序
希爾排序 每次都將元素分成一些小組,在小組內進行排序。小組根據元素數量劃分。小組跨度一般是元素數量的一半。此後每次跨度都除以二。一直到最後,小組跨度變成1。這樣就變成插入排序了。希爾排序的複雜度和增量序列是相關的 這種序列並不是很好的增量序列,使用這個增量序列的時間複雜度 最壞情形 是o n 2 h...