基本排序算法 - 希爾排序

簡(jiǎn)單插入排序存在一定的問(wèn)題:
當(dāng)待插入的數(shù)比較小時(shí)倾贰,會(huì)進(jìn)行多次比較并進(jìn)行多次的后移賦值操作,影響效率。

希爾排序也是一種插入排序,是希爾(Donald Shell)在1959年提出的一種排序算法凿歼。它是簡(jiǎn)單插入排序經(jīng)過(guò)改進(jìn)后的一個(gè)更高效的版本,也稱為縮小增量排序冗恨。

希爾排序基本思想

希爾排序是把元素按照下標(biāo)的增量進(jìn)行分組答憔,對(duì)每組元素直接使用插入排序。這樣隨著增量的逐步減少掀抹,數(shù)組會(huì)越來(lái)越有序虐拓,當(dāng)增量減至1時(shí),執(zhí)行完該輪排序后傲武,希爾排序結(jié)束蓉驹。

圖示與代碼

根據(jù)對(duì)有序序列在插入時(shí)采用的方法不同,希爾排序又可分為交換法和移動(dòng)法揪利。

希爾排序 - 交換法

希爾排序-交換法.png
public class ShellSort {

    public static void main(String[] args) {

        int[] arr = {5, 21, 9, 6, 10, 2, 16};
        int len = arr.length;
        int temp = 0;
        int count = 0;

        System.out.println("原數(shù)組:" + Arrays.toString(arr));
        for (int gap = len / 2; gap > 0; gap /= 2) {
            // 分成的組數(shù)為gap
            for (int i = gap; i < len; i++) {
                // 遍歷各組中所有的元素戒幔,步長(zhǎng)gap
                for (int j = i - gap; j >= 0; j -= gap) {
                    // 如果當(dāng)前元素大于加上步長(zhǎng)后的那個(gè)元素,交換
                    if (arr[j] > arr[j + gap]) {
                        temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }
            }
            System.out.println("第"+(++count)+"輪:"+Arrays.toString(arr));
        }
    }

}

打印結(jié)果:

原數(shù)組:[5, 21, 9, 6, 10, 2, 16]
第1輪:[5, 10, 2, 6, 21, 9, 16]
第2輪:[2, 5, 6, 9, 10, 16, 21]

希爾排序 - 移動(dòng)法

該方法跟交換法大體一樣土童,只是進(jìn)行組內(nèi)排序時(shí)采用了移動(dòng)法(可看成一個(gè)插入排序)

public class ShellSort1 {

    public static void main(String[] args) {

        int[] arr = {5, 21, 9, 6, 10, 2, 16};
        int len = arr.length;
        int count = 0;

        System.out.println("原數(shù)組:" + Arrays.toString(arr));

        // 增量為gap,并逐步縮小增量
        for (int gap = len / 2; gap > 0; gap /= 2) {
            // 從第gap個(gè)元素工坊,逐個(gè)對(duì)其所在組進(jìn)行直接插入排序
            for (int i = gap; i < len; i++) {
                int j = i;
                int temp = arr[j];
                while (j - gap >= 0 && temp < arr[j - gap]) {
                    // 移動(dòng) 這里和插入排序是一樣的原理
                    arr[j] = arr[j - gap];
                    j -= gap;
                }
                // while退出后就給temp找到了插入位置
                arr[j] = temp;
            }
            System.out.println("第"+(++count)+"輪:"+Arrays.toString(arr));
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末献汗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子王污,更是在濱河造成了極大的恐慌罢吃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭齐,死亡現(xiàn)場(chǎng)離奇詭異尿招,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)阱驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門就谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人里覆,你說(shuō)我怎么就攤上這事丧荐。” “怎么了喧枷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵虹统,是天一觀的道長(zhǎng)弓坞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)车荔,這世上最難降的妖魔是什么渡冻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮忧便,結(jié)果婚禮上族吻,老公的妹妹穿的比我還像新娘。我一直安慰自己茬腿,他們只是感情好呼奢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著切平,像睡著了一般握础。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悴品,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天禀综,我揣著相機(jī)與錄音,去河邊找鬼苔严。 笑死定枷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的届氢。 我是一名探鬼主播欠窒,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼退子!你這毒婦竟也來(lái)了岖妄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寂祥,失蹤者是張志新(化名)和其女友劉穎荐虐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體丸凭,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡福扬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惜犀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铛碑。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虽界,靈堂內(nèi)的尸體忽然破棺而出亚茬,到底是詐尸還是另有隱情,我是刑警寧澤浓恳,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布刹缝,位于F島的核電站碗暗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梢夯。R本人自食惡果不足惜言疗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颂砸。 院中可真熱鬧噪奄,春花似錦、人聲如沸人乓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)色罚。三九已至碰缔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戳护,已是汗流浹背金抡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腌且,地道東北人梗肝。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铺董,于是被迫代替她去往敵國(guó)和親巫击。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355