歸併排序演算法

2021-05-26 02:13:01 字數 1442 閱讀 9250

這個演算法感覺比插入難理解一些,下面說說我的理解:歸併排序的步驟:

1.把長度為n的序列分為兩個長度為n/2的子串行

2.對這兩個子串行分別採用歸併排序

3.將兩個子串行合併成乙個最終的排序序列

通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。

例如乙個陣列 a[8] = 下面採用遞迴排序

先進行第一步:把這個陣列分成兩個長度為4的陣列 ,

然後第二步:對兩個陣列分別再採用歸併排序。這樣的話就又回到了第一步,再次對剛得到的兩個陣列拆分得到,和,這時得到了四個陣列又是一次遞迴呼叫了再次拆分成,和,和,和,。可能大家也注意到了我這裡的兩個陣列是一一對應的對應 ,這和陣列值的位置有關。到了這一步 每乙個陣列裡面就只有乙個元素了就不可以再拆分了。

第三步:因為我們在第二步中最後把陣列拆分成了每乙個裡面只有乙個元素的n個陣列了,所以在這一步我們要比較元素的大小 然後把n個陣列再次組合成乙個排好序的陣列。因為第一步和第二步是迴圈執行的,也就是:第一步--》第二步--》第一步--》第二步。。。所以在第三步開始時我們得到的是拆分成乙個陣列只有乙個元素的n個陣列了。

我們先兩兩比較, 比組成新的陣列 ;和比組成新的陣列..這樣第一次組成完之後 我們得到了這些都是排好序的陣列。

然後再執行第三步,把這四個陣列再次比較再次組合:一樣是兩兩比較,先比較2和4,2小於4 把2放在新的陣列的最前面,然後再比較5和4,5大於4把4放在新陣列的第二位,再比較5和7.。這樣就又得到了兩個新的陣列

然後我們再次執行第三步 把兩個新的排好序的陣列組合成乙個新的陣列。這就是我們想要的結果了。(大家可能也注意到了第二步拆了多少下,第三步就要組合多少下。。這裡我舉的例子中陣列元素為偶數個也就是每次拆分時陣列元素個數都是一樣的,如果陣列元素為奇數個也是可以的 大家可以試著推算下)

下面是**部分:

main(void)

sort(0, len-1); /*len為陣列的長度*/

return 0;

void sort(int start, int end)

int mid;

if(start < end)

void merge(int start, int mid, int end)

int n1 = mid - start + 1;

int n2 = end - mid;

int i, j, k;

int left[n1], right[n2]; /*陣列left 和 right即為兩兩對應的陣列*/

for(i = 0; i < n1; i++)

for(j = 0; j < n2; j++)

i = j = 0;

k = start;

while(i < n1 && j < n2)

while(i < n1)

while(j < n2)

以上是我的個人理解,有不對的地方,請大家多多指教,謝謝!!!

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...

歸併排序演算法

include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...

歸併排序演算法

歸併排序 歸併排序演算法是一種o nlogn 的演算法。它的最差,平均,最好時間都是o nlogn 但是它需要額外的儲存空間,這在某些記憶體緊張的機器上會受到限制。include includeusing namespace std int a 10 void merge int fir,int e...