iOS算法之希爾排序

詳細(xì)代碼請(qǐng)參考Algorithm。參考代碼比文字好理解萄唇。

希爾排序,也稱(chēng)遞減增量排序算法术幔,是插入排序的一種高速而穩(wěn)定的改進(jìn)版本另萤。因Donald Shell于1959年提出而得名。希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:插入排序在對(duì)幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí)诅挑, 效率高四敞, 即可以達(dá)到線(xiàn)性排序的效率;但插入排序一般來(lái)說(shuō)是低效的拔妥, 因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動(dòng)一位忿危。該方法的基本思想是:先將整個(gè)待排元素序列分割成若干個(gè)子序列(由相隔某個(gè)“增量”的元素組成的)分別進(jìn)行直接插入排序,然后依次縮減增量再進(jìn)行排序没龙,待整個(gè)序列中的元素基本有序(增量足夠衅坛)時(shí),再對(duì)全體元素進(jìn)行一次直接插入排序硬纤。因?yàn)橹苯硬迦肱判蛟谠鼗居行虻那闆r下(接近最好情況)解滓,效率是很高的,因此希爾排序在時(shí)間效率上有較大提高筝家。

希爾排序總結(jié)來(lái)說(shuō)就是把記錄按步長(zhǎng) gap 分組洼裤,對(duì)每組記錄采用直接插入排序方法進(jìn)行排序。隨著步長(zhǎng)逐漸減小溪王,所分成的組包含的記錄越來(lái)越多逸邦,當(dāng)步長(zhǎng)的值減小到 1 時(shí),整個(gè)數(shù)據(jù)合成為一組在扰,構(gòu)成一組有序記錄缕减,則完成排序。

算法分解

初始時(shí)芒珠,有一個(gè)大小為 10 的無(wú)序序列桥狡。在第一趟排序中,我們不妨設(shè) gap1 = N / 2 = 5皱卓,即相隔距離為 5 的元素組成一組裹芝,可以分為 5 組。接下來(lái)娜汁,按照直接插入排序的方法對(duì)每個(gè)組進(jìn)行排序嫂易。

在第二趟排序中,我們把上次的 gap 縮小一半掐禁,即 gap2 = gap1 / 2 = 2 (取整數(shù))怜械。這樣每相隔距離為 2 的元素組成一組颅和,可以分為 2 組。按照直接插入排序的方法對(duì)每個(gè)組進(jìn)行排序缕允。

在第三趟排序中峡扩,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1障本。 這樣相隔距離為 1 的元素組成一組教届,即只有一組。按照直接插入排序的方法對(duì)每個(gè)組進(jìn)行排序驾霜。此時(shí)案训,排序已經(jīng)結(jié)束。

需要注意一下的是粪糙,圖中有兩個(gè)相等數(shù)值的元素 5 和 5 强霎。我們可以清楚的看到,在排序過(guò)程中猜旬,兩個(gè)元素位置交換了。所以倦卖,希爾排序是不穩(wěn)定的算法洒擦。

算法分析


步長(zhǎng)的選擇是希爾排序的重要部分。只要最終步長(zhǎng)為1任何步長(zhǎng)序列都可以工作怕膛。算法最開(kāi)始以一定的步長(zhǎng)進(jìn)行排序熟嫩。然后會(huì)繼續(xù)以一定步長(zhǎng)進(jìn)行排序,最終算法以步長(zhǎng)為1進(jìn)行排序褐捻。當(dāng)步長(zhǎng)為1時(shí)掸茅,算法變?yōu)椴迦肱判颍@就保證了數(shù)據(jù)一定會(huì)被排序柠逞。

Donald Shell 最初建議步長(zhǎng)選擇為N/2并且對(duì)步長(zhǎng)取半直到步長(zhǎng)達(dá)到1昧狮。雖然這樣取可以比O(N2)類(lèi)的算法(插入排序)更好,但這樣仍然有減少平均時(shí)間和最差時(shí)間的余地板壮《好可能希爾排序最重要的地方在于當(dāng)用較小步長(zhǎng)排序后,以前用的較大步長(zhǎng)仍然是有序的绰精。比如撒璧,如果一個(gè)數(shù)列以步長(zhǎng)5進(jìn)行了排序然后再以步長(zhǎng)3進(jìn)行排序,那么該數(shù)列不僅是以步長(zhǎng)3有序笨使,而且是以步長(zhǎng)5有序卿樱。如果不是這樣,那么算法在迭代過(guò)程中會(huì)打亂以前的順序硫椰,那就不會(huì)以如此短的時(shí)間完成排序了繁调。

直接插入排序和希爾排序的比較

直接插入排序是穩(wěn)定的萨蚕;而希爾排序是不穩(wěn)定的。直接插入排序更適合于原始記錄基本有序的集合涉馁。希爾排序的比較次數(shù)和移動(dòng)次數(shù)都要比直接插入排序少门岔,當(dāng)N越大時(shí),效果越明顯烤送。 在希爾排序中寒随,增量序列g(shù)ap的取法必須滿(mǎn)足:最后一個(gè)步長(zhǎng)必須是 1 。 直接插入排序也適用于鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)帮坚;希爾排序不適用于鏈?zhǔn)浇Y(jié)構(gòu)妻往。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市试和,隨后出現(xiàn)的幾起案子讯泣,更是在濱河造成了極大的恐慌,老刑警劉巖阅悍,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件好渠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡节视,警方通過(guò)查閱死者的電腦和手機(jī)拳锚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)寻行,“玉大人霍掺,你說(shuō)我怎么就攤上這事“柚” “怎么了杆烁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)简卧。 經(jīng)常有香客問(wèn)我兔魂,道長(zhǎng),這世上最難降的妖魔是什么举娩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任入热,我火速辦了婚禮,結(jié)果婚禮上晓铆,老公的妹妹穿的比我還像新娘勺良。我一直安慰自己,他們只是感情好骄噪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布尚困。 她就那樣靜靜地躺著,像睡著了一般链蕊。 火紅的嫁衣襯著肌膚如雪事甜。 梳的紋絲不亂的頭發(fā)上谬泌,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音逻谦,去河邊找鬼掌实。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邦马,可吹牛的內(nèi)容都是我干的贱鼻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滋将,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邻悬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起随闽,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤父丰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后掘宪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛾扇,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年魏滚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镀首。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栏赴,死狀恐怖蘑斧,靈堂內(nèi)的尸體忽然破棺而出靖秩,到底是詐尸還是另有隱情须眷,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布沟突,位于F島的核電站花颗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惠拭。R本人自食惡果不足惜扩劝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望职辅。 院中可真熱鬧棒呛,春花似錦、人聲如沸域携。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秀鞭。三九已至趋观,卻和暖如春扛禽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皱坛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工编曼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剩辟。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓掐场,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抹沪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刻肄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容