常用排序算法(二)

之前的文章講解了三種時(shí)間復(fù)雜度為O(n^2)的簡(jiǎn)單排序算法训桶,本篇介紹另外兩種經(jīng)典排序算法希爾排序和歸并排序午笛。這兩種算法中渣刷,希爾排序理解起來不太容易鱼辙,歸并排序比較容易理解但代碼量偏多。在面試的過程中被問到的幾率比較小玫镐。

希爾排序

希爾排序是插入排序的一種倒戏,是對(duì)前一篇所講直接插入排序的優(yōu)化方法,又稱縮小增量排序恐似。
基本思想:將無序數(shù)組分割為若干個(gè)子序列杜跷,子序列不是逐段分割的,而是相隔特定的增量的子序列蹂喻,對(duì)各個(gè)子序列進(jìn)行插入排序葱椭;然后再選擇一個(gè)更小的增量,再將數(shù)組分割為多個(gè)子序列進(jìn)行排序直到選擇增量為1口四,即使用直接插入排序孵运,使最終數(shù)組成為有序。
增量的選擇:在每趟的排序過程都有一個(gè)增量蔓彩,至少滿足一個(gè)規(guī)則 增量關(guān)系 d[1] > d[2] > d[3] >..> d[n] = 1 (n趟排序)治笨。
增量的大小對(duì)排序算法性能也有影響,一般而言赤嚼,增量的初始值設(shè)為(數(shù)組長(zhǎng)度 / 2)之后的每趟排序中旷赖,數(shù)組長(zhǎng)度變?yōu)橹暗?/2,直到 增量為1時(shí)結(jié)束排序更卒。
希爾排序過程比較復(fù)雜等孵,這里有個(gè)短視頻,可以幫助理解:http://v.youku.com/v_show/id_XMjU4NTcwMDIw.html
還是直接上代碼吧:

public void shellSort(int[] nums){
    int increment = nums.length;
    int temp;
    while(true){
        increment = (int)Math.ceil(increment / 2);
        for(int i = 0; i < increment; i += increment){
            for(int j =i + increment; j < nums.length; j++){
                int k = j - increment;
                temp = nums[j];
                for(; k >= 0 && nums[k] > temp; k -= increment){
                    nums[k + increment] = nums[k];
                }
                nums[k + increment] = temp;
            }
        }
        if(increment == 1){
            break;
        }
    }
}
歸并排序

歸并排序運(yùn)用了基礎(chǔ)算法中的分治思想蹂空,將數(shù)先對(duì)半拆分為兩個(gè)數(shù)組俯萌,在對(duì)分開的數(shù)組做拆分,以此類推直到拆分出的數(shù)組的長(zhǎng)度為1時(shí)停止拆分開始?xì)w并上枕。
歸并的方式也很簡(jiǎn)單咐熙,就是創(chuàng)建一個(gè)大小為兩個(gè)數(shù)組長(zhǎng)度之和的新數(shù)組,然后兩個(gè)數(shù)組都從頭開始遍歷辨萍,按順序加入新數(shù)組棋恼,新產(chǎn)生的數(shù)組必定是排好序的,再將其與其他數(shù)組進(jìn)行歸并锈玉,直至整個(gè)數(shù)組排序完成爪飘。
思路很簡(jiǎn)單,但是代碼量還是挺大的拉背,雖然比不上堆排序悦施,但畢竟堆排序相較于歸并而言顯得更加高級(jí),相同的時(shí)間復(fù)雜度但空間復(fù)雜度堆排序優(yōu)于歸并排序去团。


歸并過程

為了方便理解,減少代碼量,本文給出歸并排序的遞歸實(shí)現(xiàn)方式:

//歸并的主方法
public int[] mergeSort(int[] nums, int low, int high){
    int mid = (low + high) / 2;
    if(low < high){
        mergeSort(nums, low, mid);
        mergeSort(nums, mid + 1, high);
        merge(nums, low, mid, high);
    }
    return nums;
}
//數(shù)組合并
public void merge(int[] nums, int low, int mid, int high){
    int[] temp = new int[high - low + 1];
    int i = low;
    int j = mid + 1;
    int cnt = 0;
    while(i <= mid && j <= high){
        if(nums[i] < nums[j]){
            temp[cnt++] = nums[i++];
        }else{
            temp[cnt++] = nums[j++];
        }
    }
    while(i <= mid){
        temp[cnt++] = nums[i++];
    }
    while(j <= high){
        temp[cnt++] = nums[j++];
    }
    for(i = 0; i < temp.length; i++){
        nums[i + low] = temp[i];
    }
}

本篇介紹的兩種排序算法在面試中不常被問到土陪,可能還沒有在筆試中考到的頻率高昼汗,但也希望理解其思想,不會(huì)寫也得會(huì)說吧鬼雀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顷窒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子源哩,更是在濱河造成了極大的恐慌鞋吉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件励烦,死亡現(xiàn)場(chǎng)離奇詭異谓着,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坛掠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門赊锚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屉栓,你說我怎么就攤上這事舷蒲。” “怎么了友多?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵牲平,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我域滥,道長(zhǎng)纵柿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任骗绕,我火速辦了婚禮藐窄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酬土。我一直安慰自己荆忍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布撤缴。 她就那樣靜靜地躺著刹枉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屈呕。 梳的紋絲不亂的頭發(fā)上微宝,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音虎眨,去河邊找鬼蟋软。 笑死镶摘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岳守。 我是一名探鬼主播凄敢,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼湿痢!你這毒婦竟也來了涝缝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤譬重,失蹤者是張志新(化名)和其女友劉穎拒逮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臀规,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滩援,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了以现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狠怨。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邑遏,靈堂內(nèi)的尸體忽然破棺而出佣赖,到底是詐尸還是另有隱情,我是刑警寧澤记盒,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布憎蛤,位于F島的核電站,受9級(jí)特大地震影響纪吮,放射性物質(zhì)發(fā)生泄漏俩檬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一碾盟、第九天 我趴在偏房一處隱蔽的房頂上張望棚辽。 院中可真熱鬧,春花似錦冰肴、人聲如沸屈藐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)联逻。三九已至,卻和暖如春检痰,著一層夾襖步出監(jiān)牢的瞬間包归,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工铅歼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留公壤,地道東北人换可。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像境钟,于是被迫代替她去往敵國(guó)和親锦担。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 概述 排序有內(nèi)部排序和外部排序慨削,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大套媚,一次不能容納全部...
    蟻前閱讀 5,191評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序缚态,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大堤瘤,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 概述排序有內(nèi)部排序和外部排序玫芦,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大本辐,一次不能容納全部的...
    Luc_閱讀 2,278評(píng)論 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,262評(píng)論 0 2
  • 晚飯之前,小妞兒要吃餅干茫多,我不讓祈匙,她就坐在沙發(fā)上大哭。 一邊哭天揖,一邊叫奶奶夺欲,奶奶,我要吃糖今膊! 雖然年紀(jì)小些阅,但她已經(jīng)...
    萌媽育兒記閱讀 900評(píng)論 4 5