排序算法系列(7)——希爾排序

shell 排序是一種插入排序
亦被稱為 縮小增量排序
shell排序的實質(zhì)就是分組插入排序

基本思想

  1. 將需要排序的元素序列array分割成若干個子序列(array1,array2,array3......)
    是根據(jù)“增量”分成的子序列场刑,增量要比array.length小絮姆,盡量可以被array的長度整除(默認(rèn)增量gap=array.length/2)
  2. 對子序列分別進行直接插入排序
  3. 然后依次縮小增量(gap=gap/2)進行重新劃分子序列棠耕,對劃分好的子序列重新進行排序
  4. 最終循環(huán)2-3步驟潮模,直到gap=1,進行完最后一次排序比伏,排序終止

描述起來不難弥锄,希爾排序背后的邏輯卻是不簡單,希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法祖能,屬于最早的一批突破復(fù)雜度O(n^2)的一批次排序歉秫,其復(fù)雜度受著數(shù)組本身的排列和初始gap的取值有關(guān),對于其復(fù)雜度的計算/證明养铸,對我個人而言有些難雁芙,數(shù)學(xué)戰(zhàn)五渣,只能哭唧唧钞螟,有能力的大佬們可以看一下本鏈接:https://blog.csdn.net/u013007900/article/details/51232472

下面筆者本著實踐的原則兔甘,進行一下希爾排序的圖解及實現(xiàn):

首先,筆者認(rèn)為前面文字還是過于抽象鳞滨,并不能直觀的表達增量(也稱希爾增量)的含義洞焙,在此結(jié)合圖形解釋一下gap究竟是怎么將數(shù)組分組的,如下圖:

希爾排序——分組.png

如上圖所示拯啦,數(shù)組的長度為9澡匪,初始gap指定為4,即按照增量=4來進行數(shù)組分組提岔;
數(shù)組下方標(biāo)記了其元素對應(yīng)的index索引序號仙蛉,按照gap進行遞增,構(gòu)造對應(yīng)分組:

第一組:index=0,4,8 → {array[0], array[4], array[8]}
第二組:index=1,5 → {array[1], array[5]}
第三組:index=2,6 → {array[2], array[6]}
第四組:index=3,7 → {array[3], array[7]}

上圖已經(jīng)足夠表明了如何進行分組碱蒙,下面就開始進行圖解整個排序的流程荠瘪,如下圖:


希爾排序.png

上圖中夯巷,按照之前所描述的算法邏輯

  1. gap依次取值 4, 2, 1,即總共進行了三輪的分組排序哀墓;
  2. 每輪的分組數(shù)量分別為 4組, 2組, 1組(可根據(jù)圖中顏色進行區(qū)分組數(shù))
  3. 每輪僅對各自組內(nèi)的序列進行排序即可趁餐。

按照算法給定的是對分組進行直接插入排序,個人認(rèn)為只要能對組內(nèi)元素進行排序篮绰,什么算法均可

原理講的差不多了后雷,下面直接上代碼,將理論具現(xiàn)到實踐中:

    public void shellSort(int[] arrays) {
        // 縮小增量法
        int gap = arrays.length / 2;
        while (gap >= 1) {
            // 共有g(shù)ap組通過增量的分組吠各,進行排序
            for (int i = 0; i < gap; i++) {
                // 對增量對應(yīng)一組的數(shù)組進行排序(對子數(shù)組隨便選擇一個排序算法)
                for (int j = i + gap; j < arrays.length; j += gap) {
                    //i,i+gap,i+2*gap,i+3*gap...
                    int index = j;
                    while (index >= i + gap && arrays[index] < arrays[index - gap]) {
                        swap(arrays, index, index - gap);
                        index -= gap;
                    }
                }
            }
            gap /= 2;
        }
    }

希爾排序臀突,總的來說不難理解,最終其實也是對gap=1贾漏,即整個數(shù)組進行最終的直接插入排序候学,但之前的幾輪排序確定了各自分組內(nèi)的相對位置,對最終的增量gap=1的排序其實是起到了輔助作用纵散。

至于具體的證明其比直接插入復(fù)雜度低梳码,性能更高,從書面語我可能給不出什么解釋伍掀,想了解的還是戳上面給出的鏈接吧掰茶,在這里也再貼一下:https://blog.csdn.net/u013007900/article/details/51232472

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜜笤,隨后出現(xiàn)的幾起案子濒蒋,更是在濱河造成了極大的恐慌,老刑警劉巖瘩例,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊胶,死亡現(xiàn)場離奇詭異,居然都是意外死亡垛贤,警方通過查閱死者的電腦和手機焰坪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聘惦,“玉大人某饰,你說我怎么就攤上這事∩埔铮” “怎么了黔漂?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禀酱。 經(jīng)常有香客問我炬守,道長,這世上最難降的妖魔是什么剂跟? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任减途,我火速辦了婚禮酣藻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳍置。我一直安慰自己辽剧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布税产。 她就那樣靜靜地躺著怕轿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辟拷。 梳的紋絲不亂的頭發(fā)上撞羽,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音衫冻,去河邊找鬼放吩。 笑死,一個胖子當(dāng)著我的面吹牛羽杰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播到推,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼考赛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了莉测?” 一聲冷哼從身側(cè)響起颜骤,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捣卤,沒想到半個月后忍抽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡董朝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年鸠项,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片子姜。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟绊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哥捕,到底是詐尸還是另有隱情牧抽,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布遥赚,位于F島的核電站扬舒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凫佛。R本人自食惡果不足惜讲坎,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一孕惜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衣赶,春花似錦诊赊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至遵馆,卻和暖如春鲸郊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背货邓。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工秆撮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人换况。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓职辨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戈二。 傳聞我的和親對象是個殘疾皇子舒裤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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