希爾排序是對直接插入排序的改進,非穩定的排序演算法,使得該改進後的插入排序對非有序序列進行排序時所需時間減少,但是對於基本有序序列進行排序時時間有所增加,但是對於基本有序序列進行排序對比冒泡和選擇時間還是有優勢。
基本思想:確定開始的增量,一般都是序列大小除以2。之後不斷除以2,縮減增量。根據增量對序列進行分組,將這些分好組的序列使用直接插入排序進行排序,直至增量到1,當增量為1時就是整個序列為一組。這過程不斷使序列向基本有序序列靠近。最後再使用直接插入排序進行排序時將非常迅速。
下圖為該思想的大概概括:
以下是該演算法的實現(c++):
//根據增量執行的直接插入排序,供希爾排序函式呼叫
template
<
typename t>
void
inserincrementsort
(vector
&vec,
int startindex,
int increment)
else
//當待插入數比前面序列所有值都小時
if(j==startindex)}}
}//希爾排序
template
<
typename t>
void
shellsort
(vector
&vec)
下面用直接插入排序和希爾排序分別對無序序列和基本有序序列的排序所需時間進行對比,序列大小為100000。
無序有序
直接插入排序
0.28s
0.002s
希爾排序
0.005
0.026
排序演算法 四 希爾排序
希爾排序是插入排序的一種優化實現,比直接插入排序演算法更高效。也是第一批演算法時間複雜度突破o n 2 的演算法之一。因 d.l.shell 於 1959 年提出而得名。希爾排序是把集合資料按下標的一定增量分組,對每組使用直接插入排序演算法排序 隨著增量的減少,集合資料越來越接近整體有序。當增量減至...
演算法 希爾排序演算法(四)
大家端午節安康,這兩天都忙著玩了。沒什麼時間寫技術部落格。不過定好的計畫一定要努力完成。這次給大家介紹一下希爾排序演算法,其實這是建立在插入排序之上的一種排序演算法。當然,作為乙個程式設計師,我們聽到諸如 建立在xx之上 是 的改進版 繼 後,x橫空出世 這些句子,本能會思考舊東西的缺點,新東西的優...
演算法基礎 希爾排序
一 希爾排序 希爾排序,也稱也稱 遞減增量排序演算法 它是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。來自維基百科 下面直接以乙個例子來說明吧!例如,乙個陣列a 為例,個數n 10。第一次 步長gap n 2 10 2 5 這樣原來的陣列可以被劃分為,之後對每個劃分以插入排序的形式互...