排序算法之歸并排序

算法思想

歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表饼煞,即把待排序序列分為若干個子序列源葫,每個子序列是有序的。然后再把有序子序列合并為整體有序序列砖瞧。

算法步驟

  1. 申請空間息堂,使其大小為兩個已經(jīng)排序序列之和,該空間用來存放合并后的序列
  2. 設定兩個指針块促,最初位置分別為兩個已經(jīng)排序序列的起始位置
  3. 比較兩個指針所指向的元素荣堰,選擇相對小的元素放入到合并空間,并移動指針到下一位置
    重復步驟3直到某一指針超出序列尾
  4. 將另一序列剩下的所有元素直接復制到合并序列尾
歸并排序示例

算法復雜度

  • 時間復雜度為O(nlog?n) 這是該算法中最好竭翠、最壞和平均的時間性能振坚。
  • 空間復雜度為 O(n)

算法穩(wěn)定性

歸并排序比較占用內存,但卻是一種效率高且穩(wěn)定的算法逃片。

算法實現(xiàn)

public void mergeSort(int[] arr,int left,int right){
        if(left >= right){
            return;
        }

        int center = (right + left)/2;
        mergeSort(arr,left,center);
        mergeSort(arr,center + 1,right);
        merge(arr,left,right,center);
    }
private void merge(int[] arr,int left,int right,int center){
        int[] tmpArr = new int[right - left + 1]; //存儲排序結果
        int tmpIndex = 0;

        int start1 = left;
        int start2 = center + 1;

        while(start1 <= center && start2 <= right){
            if(arr[start1] < arr[start2]){
                tmpArr[tmpIndex++] = arr[start1++];
            }else{
                tmpArr[tmpIndex++] = arr[start2++];
            }
        }

        while(start1 <= center){
            tmpArr[tmpIndex++] = arr[start1++];
        }
        while(start2 <= right){
            tmpArr[tmpIndex++] = arr[start2++];
        }

        tmpIndex = 0;
        while(left <= right){
            arr[left++] = tmpArr[tmpIndex++];
        }
    }

參考文章

  1. 八大排序算法
  2. 歸并排序-百度百科
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市只酥,隨后出現(xiàn)的幾起案子褥实,更是在濱河造成了極大的恐慌,老刑警劉巖裂允,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损离,死亡現(xiàn)場離奇詭異,居然都是意外死亡绝编,警方通過查閱死者的電腦和手機僻澎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十饥,“玉大人窟勃,你說我怎么就攤上這事《憾拢” “怎么了秉氧?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜒秤。 經(jīng)常有香客問我汁咏,道長,這世上最難降的妖魔是什么作媚? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任攘滩,我火速辦了婚禮,結果婚禮上纸泡,老公的妹妹穿的比我還像新娘漂问。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布级解。 她就那樣靜靜地躺著冒黑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勤哗。 梳的紋絲不亂的頭發(fā)上抡爹,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音芒划,去河邊找鬼冬竟。 笑死,一個胖子當著我的面吹牛民逼,可吹牛的內容都是我干的泵殴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拼苍,長吁一口氣:“原來是場噩夢啊……” “哼笑诅!你這毒婦竟也來了?” 一聲冷哼從身側響起疮鲫,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吆你,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俊犯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妇多,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年燕侠,在試婚紗的時候發(fā)現(xiàn)自己被綠了者祖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绢彤,死狀恐怖七问,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情茫舶,我是刑警寧澤烂瘫,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站奇适,受9級特大地震影響坟比,放射性物質發(fā)生泄漏。R本人自食惡果不足惜嚷往,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一葛账、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧皮仁,春花似錦籍琳、人聲如沸菲宴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喝峦。三九已至,卻和暖如春呜达,著一層夾襖步出監(jiān)牢的瞬間谣蠢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工查近, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留眉踱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓霜威,卻偏偏與公主長得像谈喳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戈泼,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,262評論 0 2
  • 概述 排序有內部排序和外部排序婿禽,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大大猛,一次不能容納全部...
    蟻前閱讀 5,191評論 0 52
  • 概述:排序有內部排序和外部排序扭倾,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大胎署,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評論 0 15
  • 終究拗不過好友的勸告吆录,我還是答應去赴約窑滞,為了提高相親的質量琼牧,我刻意化了妝。 說實話哀卫,我是一個化妝比素顏差別很大的人...
    素一航閱讀 707評論 5 4
  • 文/婧曦 窗邊垂掛著的簾 將這世界 隔絕成兩個 簾外小雨綿綿 澆不滅的熱情 狂風席卷 吹不散的歡笑 簾內黑暗的角落...
    JING_婧閱讀 213評論 0 0