歸并排序

廢話不多說先上代碼

void mergeSort(int arr[], int start, int end) {
    if(start >= end)
        return;

    int middle = start + ((end - start) >> 1);

    mergeSort(arr, start, middle);
    mergeSort(arr, middle + 1, end);

    _merge(arr, start, middle, middle + 1, end);

    return;
}

void _merge(int arr[], int start1, int end1, int start2, int end2) {
    int temp[end2 - start1 + 1];
    int index = 0;
    int s1 = start1;
    int s2 = start2;

    while(s1 <= end1 && s2 <= end2) {
        if (arr[s1] < arr[s2])
        {
            temp[index++] = arr[s1++];
        } else {
            temp[index++] = arr[s2++];
        }
    }

    while(s1 <= end1)
        temp[index++] = arr[s1++];
    
    while(s2 <= end2)
        temp[index++] = arr[s2++];

    for (int i = 0; i <= end2 - start1; ++i)
    {
        arr[start1 + i] = temp[i];
    }

    return;
}
//代碼看著比較長(zhǎng),沒有特別的東西

時(shí)間復(fù)雜度

O(n * log n) 這個(gè)時(shí)間復(fù)雜度不會(huì)變化淑履,無(wú)論是完全逆序還是已經(jīng)有序

空間復(fù)雜度

O(n) 不是原地排序

穩(wěn)定排序

是穩(wěn)定排序

算法核心思想

最經(jīng)典的分而治之的思想


圖片.png

將待排序數(shù)組從中間分為兩個(gè)待排序數(shù)組隶垮。
對(duì)兩個(gè)數(shù)組分別排序,再將兩個(gè)有序數(shù)組合并秘噪。

一步一步實(shí)現(xiàn)歸并排序

終止條件
數(shù)組只有一個(gè)元素就不可再分解狸吞。

void mergeSort(int arr[], int start, int end) {
    if(start >= end)
        return;
}

拆分?jǐn)?shù)組

void mergeSort(int arr[], int start, int end) {
    if(start >= end)
        return;
    //計(jì)算中間元素
    int middle = start + ((end - start) >> 1);
    //對(duì)拆分后的數(shù)組再次進(jìn)行拆分
    mergeSort(arr, start, middle);
    mergeSort(arr, middle + 1, end);
}

執(zhí)行合并
數(shù)組拆分到最小單位后進(jìn)行合并

void mergeSort(int arr[], int start, int end) {
    if(start >= end)
        return;
    //計(jì)算中間元素
    int middle = start + ((end - start) >> 1);
    //對(duì)拆分后的數(shù)組再次進(jìn)行拆分
    mergeSort(arr, start, middle);
    mergeSort(arr, middle + 1, end);
    //合并函數(shù)
    _merge(arr, start, middle, middle + 1, end);
}

合并兩個(gè)有序數(shù)組

void mergeSort(int arr[], int start, int end) {
    if(start >= end)
        return;
    //計(jì)算中間元素
    int middle = start + ((end - start) >> 1);
    //對(duì)拆分后的數(shù)組再次進(jìn)行拆分
    mergeSort(arr, start, middle);
    mergeSort(arr, middle + 1, end);
    //合并函數(shù)
    _merge(arr, start, middle, middle + 1, end);
}

//合并函數(shù) 
//start1、end1 是第一個(gè)數(shù)組的起始下標(biāo)
//start2指煎、end2 是第二個(gè)數(shù)組的起始下標(biāo)
void _merge(int arr[], int start1, int end1, int start2, int end2) {
    //申請(qǐng)一個(gè)臨時(shí)數(shù)組蹋偏,存儲(chǔ)合并的元素
    int temp[end2 - start1 + 1];
    int index = 0;
    //用來(lái)表示要比較的元素
    int s1 = start1;
    int s2 = start2;

    //合并兩個(gè)有序數(shù)組
    while(s1 <= end1 && s2 <= end2) {
        if(arr[s1] < arr[s2]) {
            temp[index++] = arr[s1++];
        } else {
            temp[index++] = arr[s2++];
        }
    }
    
    //將剩下的元素添加到臨時(shí)數(shù)組
    while(s1 <= end1)
        temp[index++] = arr[s1++];
    while(s2 <= end2)
        temp[index++] = arr[s2++];
    
    //將臨時(shí)數(shù)組中的變量賦值給原數(shù)組
    for(int i = 0; i <= end2 - start1; ++i) {
        arr[i + start1] = temp[i];
    }

    return;
}
//歸并排序結(jié)束

歸并排序結(jié)束了

應(yīng)該還是比較好理解,就是代碼比較復(fù)雜至壤,小心點(diǎn)別寫錯(cuò)了就可以暖侨。

都看到這里了,點(diǎn)個(gè)贊再走啊~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崇渗,一起剝皮案震驚了整個(gè)濱河市字逗,隨后出現(xiàn)的幾起案子京郑,更是在濱河造成了極大的恐慌,老刑警劉巖葫掉,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件些举,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俭厚,警方通過查閱死者的電腦和手機(jī)户魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挪挤,“玉大人叼丑,你說我怎么就攤上這事】该牛” “怎么了鸠信?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)论寨。 經(jīng)常有香客問我星立,道長(zhǎng),這世上最難降的妖魔是什么葬凳? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任绰垂,我火速辦了婚禮,結(jié)果婚禮上火焰,老公的妹妹穿的比我還像新娘劲装。我一直安慰自己,他們只是感情好昌简,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布酱畅。 她就那樣靜靜地躺著,像睡著了一般江场。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窖逗,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天址否,我揣著相機(jī)與錄音,去河邊找鬼碎紊。 笑死佑附,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仗考。 我是一名探鬼主播音同,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秃嗜!你這毒婦竟也來(lái)了权均?” 一聲冷哼從身側(cè)響起顿膨,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叽赊,沒想到半個(gè)月后恋沃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡必指,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年囊咏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塔橡。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅割,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葛家,到底是詐尸還是另有隱情户辞,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布惦银,位于F島的核電站咆课,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扯俱。R本人自食惡果不足惜书蚪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅栅。 院中可真熱鬧殊校,春花似錦、人聲如沸读存。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)让簿。三九已至敬察,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尔当,已是汗流浹背莲祸。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椭迎,地道東北人锐帜。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畜号,于是被迫代替她去往敵國(guó)和親缴阎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361