【算法】希爾排序算法的講解和代碼實踐

思路

希爾排序,與其他排序不同的是工闺,別的排序都能通過名字關(guān)聯(lián)上,而希爾排序的名字瓣蛀,怎么看也不太像中文陆蟆。
其實希爾排序就是插入排序的進(jìn)化版,它會先聲明一個間隙參數(shù)惋增,然后按照間隙參數(shù)叠殷,把數(shù)組分成若干各子數(shù)組,對子數(shù)組進(jìn)行插入排序诈皿。隨著間隙越縮越小林束,整個數(shù)組的順序也就慢慢排好了。
看起來不太容易理解稽亏,下面就拆開說一下步驟:

  1. 計算出一個間隙值壶冒;
  2. 按照間隙值把數(shù)組分成若干個子數(shù)組;
  3. 對子數(shù)組進(jìn)行插入排序截歉;
  4. 將間隙縮小胖腾,重新分組并插入排序;
  5. 直至整個數(shù)組排序完成。

講解

有數(shù)組如下:


image.png

現(xiàn)在要對它進(jìn)行希爾排序咸作。首先計算出一個間隙值gap锨阿,我們用數(shù)組長度除以2,計算出第一個gap:8 / 2 = 4记罚;
那么間隔為4(比如下標(biāo)為0的元素群井,加4,即下標(biāo)為4的元素毫胜,兩個元素看做一個子數(shù)組)的元素即為一個子數(shù)組,我們用不同顏色將子數(shù)組標(biāo)記出來:


image.png

然后對子數(shù)組進(jìn)行插入排序诬辈,插入排序前面的文章講過了酵使,這里就直接進(jìn)行排序了:
image.png

然后將gap值自除2,計算出下一個gap為:4 / 2 = 2焙糟,并將數(shù)組重新拆分子數(shù)組:


image.png

這次就分成了兩個子數(shù)組口渔,繼續(xù)對這兩個子數(shù)組進(jìn)行排序:
image.png

順序越來越明顯了。gap再次自除2穿撮,計算出最后一個gap為:2 / 2 = 1缺脉,那么這次拆分出來的數(shù)組其實就是一個完整的數(shù)組了:
image.png

再次對數(shù)組進(jìn)行排序:
image.png

整個數(shù)組的順序就拍好啦,這就是希爾排序悦穿。

實現(xiàn)

    @Test
    public void shellSort() {
        int[] nums = new int[]{26, -3, 14, -15, 0, 324, 1, 22};
        sort(nums);
        System.out.println(Arrays.toString(nums));
    }

    private void sort(int[] nums) {
        // 如果數(shù)組長度小于2則不需要排序
        if (nums.length < 2) {
            return;
        }
        // 計算出第一個間隙值
        int gap = nums.length / 2;
        // 當(dāng)gap值自除到0時攻礼,說明已經(jīng)完成排序,結(jié)束遍歷
        while (gap != 0) {
            // 子數(shù)組個數(shù)栗柒,每個子數(shù)組都要排序礁扮,所以也是要遍歷的次數(shù)
            for (int times = 0; times < nums.length / gap; times++) {
                // 進(jìn)行插入排序,因為相鄰元素變成了間隙為gap瞬沦,所以單位都是gap
                for (int i = times + gap; i < nums.length; i += gap) {
                    int cur = nums[i];
                    int insertIndex = -1;
                    for (int j = i - gap; j >= 0; j -= gap) {
                        if (nums[j] > cur) {
                            nums[j + gap] = nums[j];
                            insertIndex = j;
                        }
                    }
                    if (insertIndex != -1) {
                        nums[insertIndex] = cur;
                    }
                }
            }
            // gap自除2
            gap /= 2;
        }
    }
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末太伊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逛钻,更是在濱河造成了極大的恐慌僚焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙痘,死亡現(xiàn)場離奇詭異芳悲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)边坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門芭概,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惩嘉,你說我怎么就攤上這事罢洲。” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵惹苗,是天一觀的道長殿较。 經(jīng)常有香客問我,道長桩蓉,這世上最難降的妖魔是什么淋纲? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮院究,結(jié)果婚禮上洽瞬,老公的妹妹穿的比我還像新娘。我一直安慰自己业汰,他們只是感情好伙窃,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著样漆,像睡著了一般为障。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上放祟,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天鳍怨,我揣著相機(jī)與錄音,去河邊找鬼跪妥。 笑死鞋喇,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眉撵。 我是一名探鬼主播确徙,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼执桌!你這毒婦竟也來了鄙皇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仰挣,失蹤者是張志新(化名)和其女友劉穎伴逸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘壶,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡错蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颓芭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顷锰。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亡问,靈堂內(nèi)的尸體忽然破棺而出官紫,到底是詐尸還是另有隱情肛宋,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布束世,位于F島的核電站酝陈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毁涉。R本人自食惡果不足惜沉帮,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贫堰。 院中可真熱鬧穆壕,春花似錦、人聲如沸其屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漫玄。三九已至,卻和暖如春压彭,著一層夾襖步出監(jiān)牢的瞬間睦优,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工壮不, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留汗盘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓询一,卻偏偏與公主長得像隐孽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子健蕊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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