排序_插入排序之希爾排序(縮小增量排序)

概述

希爾(Shell)排序又稱為縮小增量排序不翩,它是一種插入排序。它是直接插入排序算法的一種威力加強(qiáng)版麻裳。

代碼實(shí)現(xiàn)

/**
 * 基本思想:
 * 先取一個小于n的整數(shù)d1作為第一個增量口蝠,把文件的全部記錄分組。
 * 所有距離為d1的倍數(shù)的記錄放在同一個組中津坑。
 * 先在各組內(nèi)進(jìn)行直接插入排序妙蔗;然后,取第二個增量d2<d1
 * 重復(fù)上述的分組和排序疆瑰,直至所取的增量 =1( < …<d2<d1)灭必,
 * 即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂? * 
 * 
 * 
 * 
 * @author yeoggc
 *
 */
public class 希爾排序 {

    private void shellSort(int[] array) {

        int gap = array.length / 2;// 初始化gap為數(shù)組長度/2

        while (1 <= gap) {// 中止條件是gap<1

            // 對步長為gap的元素進(jìn)行分組
            // 交替的對每組進(jìn)行直接插入排序
            for (int i = gap; i < array.length; i++) {

                int temp = array[i];// 待排序的數(shù)據(jù)
                int j = 0;// 有序區(qū)中待比較元素的下標(biāo),初始時乃摹,從有序區(qū)中最后一個元素開始比較起

                // 對步長為 gap 的元素組進(jìn)行排序
                for (j = i - gap; j >= 0 && temp < array[j]; j = j - gap) {
                    array[j + gap] = array[j];
                }

                array[j + gap] = temp;

            }
            System.out.format("gap = %d:\t", gap);
            printAll(array);
            gap = gap / 2; // 減小增量
        }

    }

    public static void main(String[] args) {
        int[] array = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };

        // 調(diào)用希爾排序方法
        希爾排序 shell = new 希爾排序();
        System.out.print("排序前:\t\t");
        shell.printAll(array);
        shell.shellSort(array);
        System.out.print("排序后:\t\t");
        shell.printAll(array);
    }

    // 打印完整序列
    public void printAll(int[] list) {
        for (int value : list) {
            System.out.print(value + "\t");
        }
        System.out.println();
    }

}

算法分析

這例子希爾排序的步長選擇都是從n/2開始禁漓,每次再減半,直到最后為1孵睬。這并不是最高效的步長選擇播歼。

希爾排序是不穩(wěn)定的:我們知道一次插入排序是穩(wěn)定的,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動秘狞,最后其穩(wěn)定性就會被打亂叭莫,即希爾排序中相等數(shù)據(jù)可能會交換位置。

希爾排序的平均時間復(fù)雜度為O(nlog2n)烁试。

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

直接插入排序是穩(wěn)定的雇初;而希爾排序是不穩(wěn)定的。
直接插入排序更適合于原始記錄基本有序的集合减响。
希爾排序的比較次數(shù)和移動次數(shù)都要比直接插入排序少靖诗,當(dāng)N越大時,效果越明顯支示。
在希爾排序中刊橘,增量序列g(shù)ap的取法必須滿足:最后一個步長必須是 1 。
直接插入排序也適用于鏈?zhǔn)酱鎯Y(jié)構(gòu)颂鸿;希爾排序不適用于鏈?zhǔn)浇Y(jié)構(gòu)促绵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘴纺,隨后出現(xiàn)的幾起案子败晴,更是在濱河造成了極大的恐慌,老刑警劉巖栽渴,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尖坤,死亡現(xiàn)場離奇詭異,居然都是意外死亡熔萧,警方通過查閱死者的電腦和手機(jī)糖驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佛致,“玉大人贮缕,你說我怎么就攤上這事“秤埽” “怎么了感昼?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罐脊。 經(jīng)常有香客問我定嗓,道長,這世上最難降的妖魔是什么萍桌? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任宵溅,我火速辦了婚禮,結(jié)果婚禮上上炎,老公的妹妹穿的比我還像新娘恃逻。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布寇损。 她就那樣靜靜地躺著凸郑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矛市。 梳的紋絲不亂的頭發(fā)上芙沥,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音浊吏,去河邊找鬼而昨。 笑死,一個胖子當(dāng)著我的面吹牛卿捎,可吹牛的內(nèi)容都是我干的配紫。 我是一名探鬼主播径密,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼午阵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了享扔?” 一聲冷哼從身側(cè)響起底桂,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惧眠,沒想到半個月后籽懦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年暮顺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秀存。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡捶码,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出或链,到底是詐尸還是另有隱情惫恼,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布澳盐,位于F島的核電站祈纯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叼耙。R本人自食惡果不足惜腕窥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筛婉。 院中可真熱鬧簇爆,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至安寺,卻和暖如春厕妖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挑庶。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工言秸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迎捺。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓举畸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凳枝。 傳聞我的和親對象是個殘疾皇子抄沮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序岖瑰,而外部排序是因排序的數(shù)據(jù)很大叛买,一次不能容納全部的...
    Luc_閱讀 2,255評論 0 35
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序蹋订,而外部排序是因排序的數(shù)據(jù)很大率挣,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序露戒,而外部排序是因排序的數(shù)據(jù)很大椒功,一次不能容納全部...
    蟻前閱讀 5,167評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • “你就是個混蛋动漾,徹徹底底的大混蛋” 01 她是一個不安分的姑娘,向往仗劍走天涯的生活撩鹿,她愛跳舞愛唱歌愛吉他愛帥哥谦炬,...
    劉哈哈_2b34閱讀 323評論 0 0