歸併至原空間
將兩個有序數列組成乙個新的有序數列。
從最小端開始,哪邊小就取哪邊放入新序列中,最後得到的序列依然是有序的。
若兩個有序數列長度分別為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...