演算法篇 二路歸併

2021-10-24 02:26:41 字數 1179 閱讀 4389

歸併至原空間

將兩個有序數列組成乙個新的有序數列。

從最小端開始,哪邊小就取哪邊放入新序列中,最後得到的序列依然是有序的。

若兩個有序數列長度分別為n和m, 則歸併的時間複雜度為o(n

+m

)\ o(n+m)

o(n+m)

, 空間複雜度o(n

+m

)\ o(n+m)

o(n+m)

假設兩個有序數列分別在陣列a和陣列b中,合併後儲存到另乙個陣列c。中

int

*merge

(int a,

int lena,

int b,

int lenb)

return c;

}

int

*merge

(int a,

int lena,

int b,

int lenb)

//剩餘部分直接加入末尾

while

(ia < lena)

c[ic++

]= a[ia++];

while

(ib < lenb)

c[ic++

]= b[ib++];

return c;

}

假設兩個都在陣列a中,且記憶體連續,分別為a[left] ~ a[m]和a[m+1] ~ a[right],要將陣列歸併後儲存到原來的位置,則需要額外的空間。

void

merge

(int a,

int left,

int m,

int right)

//拷貝回陣列a

for(

int i =

0; i < lentemp; i++

) a[i + left]

= temp[i]

;free

(temp)

;}

void

merge

(int a,

int left,

int m,

int right)

free

(l);

free

(r);

}

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...