希爾排序聽起來(lái)有點(diǎn)難鸟廓,其實(shí)很簡(jiǎn)單

前言

直接插入排序當(dāng)待排序數(shù)據(jù)的順序和期望排序結(jié)果相反時(shí),排序效率是最差的引谜;上次聊到的折半插入排序只是減少有序列表的比較次數(shù)牍陌,而對(duì)于整體數(shù)據(jù)遍歷次數(shù)還是沒有得到優(yōu)化;接下來(lái)要說(shuō)的希爾排序就是針對(duì)整體數(shù)據(jù)進(jìn)行優(yōu)化员咽,從而提升排序效率毒涧。

正文

1.1 希爾排序算法思想

希爾排序(Shell's Sort)是直接插入排序算法的改進(jìn)版,又稱“縮小增量排序”(Diminishing Increment Sort);

算法思想

將待排序數(shù)據(jù)根據(jù)指定步長(zhǎng)進(jìn)行分組贝室,分別進(jìn)行直接插入排序契讲;減小步長(zhǎng),重復(fù)分組滑频,重復(fù)直接插入排序捡偏,直到步長(zhǎng)為1時(shí)進(jìn)行最后一次插入排序。

對(duì)于第一次步長(zhǎng)可以根據(jù)需要自定義峡迷,但一般推薦會(huì)設(shè)置為元素個(gè)數(shù)除以2(lenght/2)银伟,后續(xù)的步長(zhǎng)依次是上一次步長(zhǎng)除以2(stepk=stepk-1/2),直到步長(zhǎng)為1绘搞,如下圖:

image-20210407235130599

上面說(shuō)到步長(zhǎng)可以理解為增量彤避,而減少步長(zhǎng)的過(guò)程,也就是縮小增量夯辖,即希爾排序又稱為縮小增量排序忠藤。

分組原理(第一次分組的step1=6/2=3):

  • 第一組:0索引位的元素為2,0+step1的索引位為3楼雹,對(duì)應(yīng)的元素是1模孩,3+step1越界了,則第一組的元素為2贮缅、1榨咐;

  • 第二組:1索引位的元素為5,1+step1的索引位為4谴供,對(duì)應(yīng)的元素是9块茁,4+step1越界了,則第二組的元素為5桂肌、9数焊;

  • 第三組:2索引位的元素為6,2+step1的索引位為5崎场,對(duì)應(yīng)的元素是3佩耳,5+step1越界了,則第三組的元素為6谭跨、3干厚;此時(shí)元素就分組完成了李滴;

接下來(lái)的分組就依次遞減步長(zhǎng),即上一次步長(zhǎng)除以2取整蛮瞄; 然后根據(jù)新算出來(lái)的步長(zhǎng)繼續(xù)將上一次的排序的結(jié)果分組即可所坯;直到步長(zhǎng)遞減到為1時(shí),整體進(jìn)行最后一次直接插入排序?yàn)橹梗?/p>

1.2 希爾排序算法實(shí)現(xiàn)與解析

代碼實(shí)現(xiàn)(升序):

代碼

運(yùn)行結(jié)果如下:

結(jié)果

步驟解析:

步驟

上圖步驟說(shuō)明:

  • 將原始數(shù)據(jù)array復(fù)制到新數(shù)組中arrayb中挂捅,這步的主要目的是后續(xù)不需要聲明額外臨時(shí)變量芹助,也為了后續(xù)核心代碼實(shí)現(xiàn)邏輯簡(jiǎn)單易懂,減少過(guò)多的判斷闲先;0索引位也充當(dāng)為哨兵位状土;

  • 第一步根據(jù)元素個(gè)數(shù)算出第一次步長(zhǎng)step1=3,根據(jù)步長(zhǎng)將待排序數(shù)據(jù)進(jìn)行虛擬分組饵蒂,索引位為1的元素和索引位為1+step的元素為一組声诸,索引位為2的元素和索引位為2+step的元素為一組酱讶,索引位為3的元素和索引位為3+step的元素為一組退盯;則將待排序數(shù)據(jù)分為2、1泻肯;5渊迁、9;6灶挟、3 三組琉朽;

  • 第二步開始遍歷每一組數(shù)據(jù),針對(duì)每一組數(shù)據(jù)進(jìn)行直接插入排序稚铣; 首先是第一組數(shù)據(jù)2箱叁、1,將待排序數(shù)據(jù)1放入哨兵位(即0索引位)惕医,哨兵位的數(shù)據(jù)1和有序列表中的2進(jìn)行比較耕漱,2大于1,則需要騰出空位抬伺,所以2移到分組中索引位為4的位置螟够;然后將哨兵位的數(shù)據(jù)1插入到騰出的空位中;

  • 第三步遍歷第二組數(shù)據(jù)5峡钓、9妓笙,首先將待排序數(shù)據(jù)9放入哨兵位(即0索引位),哨兵位的數(shù)據(jù)9和有序列表中的5進(jìn)行比較能岩,5小于9寞宫,則不需改變位置;

  • 第四步遍歷第三組數(shù)據(jù)6拉鹃、3淆九,首先將待排序數(shù)據(jù)3放入哨兵位(即0索引位)统锤,哨兵位的數(shù)據(jù)3和有序列表中的6進(jìn)行比較,6大于3炭庙,則需要騰出空位饲窿,所以6移到分組中索引位為6的位置;然后將哨兵位的數(shù)據(jù)3插入到騰出的空位中焕蹄;

  • 分組排序完成之后逾雄,最終得出第一次分組排序結(jié)果:
    image

第一次分組排序完成之后,調(diào)整步長(zhǎng)腻脏,繼續(xù)進(jìn)行分組鸦泳,由于第二次計(jì)算出的步長(zhǎng)step2=step1/2=1,即將所有上一次分組的數(shù)據(jù)全部為一組進(jìn)行最后一次直接插入排序即可永品;這里就不在重復(fù)演示了做鹰,具體步驟和之前說(shuō)到的直接插入排序一樣,參照這篇大牛領(lǐng)導(dǎo)單獨(dú)找我聊了兩句:搞框架的同時(shí)別忘了算法鼎姐。

通過(guò)第二次插入排序完成之后就得到最后的排序結(jié)果啦钾麸。

1.3 希爾排序算法分析

時(shí)間復(fù)雜度

時(shí)間復(fù)雜度最壞情況和直接插入排序的時(shí)間復(fù)雜一樣,都是O(n2)炕桨,但有其他大神經(jīng)過(guò)大量演示饭尝,希爾排序的時(shí)間復(fù)雜度一般為O(n(1.3~2)),比O(n2)性能好献宫。

空間復(fù)雜度 在算法核心部分只采用了固定的幾個(gè)中間變量((i,j,step,arrayb[0]))钥平,所以算法過(guò)程中消耗的內(nèi)存是一個(gè)常量,則空間復(fù)雜度為O(1)姊途;

穩(wěn)定性 由于在排序過(guò)程中是根據(jù)步長(zhǎng)將原始數(shù)據(jù)進(jìn)行分組涉瘾,這樣就可能會(huì)導(dǎo)致相同的元素分到不同組,在最終排序時(shí)就不能保證原來(lái)兩個(gè)相同元素的順序啦捷兰,所以希爾排序是不穩(wěn)定的立叛。

綜上所述,希爾排序的時(shí)間復(fù)雜度為O(n2)寂殉,空間復(fù)雜度為O(1)囚巴,是不穩(wěn)定算法;

總結(jié)

到這里友扰,插入排序的三種排序介紹完畢彤叉,下期開始介紹交換排序;這里先總結(jié)一下插入排序的相關(guān)關(guān)鍵點(diǎn)(下圖綠色部分)村怪;如下:

總結(jié)

感謝小伙伴的:點(diǎn)贊秽浇、收藏評(píng)論,下期繼續(xù)~~~

一個(gè)被程序搞丑的帥小伙甚负,關(guān)注"Code綜藝圈"柬焕,跟我一起學(xué)~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末审残,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斑举,更是在濱河造成了極大的恐慌搅轿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富玷,死亡現(xiàn)場(chǎng)離奇詭異璧坟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)赎懦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門雀鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人励两,你說(shuō)我怎么就攤上這事黎茎。” “怎么了当悔?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵傅瞻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我先鱼,道長(zhǎng)俭正,這世上最難降的妖魔是什么奸鬓? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任焙畔,我火速辦了婚禮,結(jié)果婚禮上串远,老公的妹妹穿的比我還像新娘宏多。我一直安慰自己,他們只是感情好澡罚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布伸但。 她就那樣靜靜地躺著,像睡著了一般留搔。 火紅的嫁衣襯著肌膚如雪更胖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天隔显,我揣著相機(jī)與錄音却妨,去河邊找鬼。 笑死括眠,一個(gè)胖子當(dāng)著我的面吹牛彪标,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掷豺,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捞烟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薄声!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起题画,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤默辨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后苍息,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廓奕,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年档叔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桌粉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衙四,死狀恐怖铃肯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情传蹈,我是刑警寧澤押逼,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站惦界,受9級(jí)特大地震影響挑格,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沾歪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一漂彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灾搏,春花似錦挫望、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泉哈,卻和暖如春蛉幸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丛晦。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工奕纫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人采呐。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓若锁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斧吐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子又固,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 排序算法-7---希爾排序 概念 希爾排序(Shellsort)仲器,也稱遞減增量排序算法,是一種典型的插入排序算法仰冠,...
    開了那么閱讀 311評(píng)論 0 0
  • 希爾排序 概括:其實(shí)希爾排序就是將數(shù)組進(jìn)行拆分乏冀,對(duì)分出來(lái)的每一個(gè)數(shù)組進(jìn)行直接插入排序。 具體講解 設(shè)置一個(gè)step...
    守敬閱讀 351評(píng)論 0 1
  • 前言 當(dāng)待插入元素是一個(gè)很小(當(dāng)需求是從小到大排序時(shí)洋只,從大到小排序時(shí)此處為很大)直接插入排序需要移動(dòng)較多次數(shù)辆沦,性能...
    隨機(jī)的未知閱讀 344評(píng)論 0 0
  • 概念: 希爾排序(shell sort)是插入排序的一種,也稱為縮小增量排序识虚,是直接插入排序算法的一種更高效的改進(jìn)...
    Simon0903閱讀 295評(píng)論 0 1
  • 參考Java排序算法(四):希爾排序[http://blog.csdn.net/zdp072/article/de...
    合肥黑閱讀 664評(píng)論 0 3