演算法筆記(六) 之歸併排序

2021-10-09 04:08:11 字數 1285 閱讀 1169

老規矩–妹妹鎮樓:

序列中共n個數,將序列兩兩分組,分為 [n / 2]個組,組內進行單獨排序,然後將這些組兩兩歸併,每兩個組合並成乙個組;於是生成了[n / 4]個組,組內依然單獨排序;重複同樣的操作,直到合併成乙個組為止。時間複雜度為o(nlogn)。

序列: 12 ,33, 32, 23, 55, 43, 23, 21, 55

1. 第一次歸併

得到5組:【12, 33】, 【32, 23】, 【55, 43】, 【23, 21】,

組內排序:【12, 33】, 【23, 32】, 【43, 55】, 【21, 23】,

2. 第二次歸併

兩兩歸併,得到3組:【12, 33, 23, 32】, 【43, 55, 21, 23】,

組內排序:【12,23, 32, 33】,【21, 23, 43, 55】,

3. 第三次歸併

得到2組:【12, 23, 32, 33, 21, 23, 43, 55】,

組內排序:【12, 21, 23, 23, 32, 33, 43, 55】,

4.第四次歸併

得到1組:【12, 21, 23, 23, 32, 33, 43, 55, 55】

組內排序:【12, 21, 23, 23, 32, 33, 43, 55, 55】

歸併排序,就是將兩個有序序列合併成乙個有序序列,並且需要不停地遞迴。將序列分為左右兩半,對兩個子區間分別遞迴歸併排序,然後合併兩個有序的子區間為有序序列即可。

const

int maxn =

100;

//歸併兩個區間[l1, r1], [l2, r2]

void

merge

(int a,

int l1,

int r1,

int l2,

int r2)

else

}while

(i <= r1)

while

(j <= r2)

for(

int i =

0; i < index;

++i)

}//用歸併排序乙個序列

void

mergesort

(int a,

int left,

int right)

}

排序演算法(六) 歸併排序

對於歸併排序,與快速排序一樣,巧妙的應用了分治演算法的核心思想,它將整個序列分成若干組子串行,對這些子串行進行排序後,在一步一步進行合併有序子串行,從而使得整個序列達到有序。但針對於歸併排序,有著兩種不同的排序方式,一是通過整個序列進行著手,將這個序列進行一步一步的劃分,自頂向下進行處理,主要步驟包...

排序演算法 六 歸併排序

歸併排序的基本思想是分治法。先將無序序列分為若干個無序子串行,然後對無序子串行進行排序,最後合併有序子串行,得到完全有序的序列。這就是分解,求解,合併的過程。將待排序序列data 0,1,2 n 1 看成是n個長度為一的序列,將相鄰序列進行合併,得到n 2個長度為2的有序序列 將相鄰序列再次進行合併...

排序演算法(六) 歸併排序

歸併排序 merge sort 又稱二路歸併排序,是指將乙個陣列一分為二,對每乙個子陣列遞迴排序,最後將排好的子陣列合併為乙個有序陣列的過程。歸併排序,是 分治法 應用的完美實現。1.歸併排序圖示 2.歸併排序流程 通過圖示,可以發現歸併排序一共只需要兩個步驟 3.實現 歸併排序的 邏輯還是很容易看...