寫作功底有限,不明白的推薦看一下麻省理工學院的演算法導**開課。
歸併演算法是指將兩個有序序列合併為乙個有序序列的方法。
例如,現有兩個有序序列a[1,3,5], b[2,4,6],將其合併為乙個序列c。
分別對a,b建乙個游標索引,初始值為0。
第一步比較a,b索引的值a[1,3,5],b[2,4,6],1 < 2,所以c=[1,…], a的索引+1。
第二步比較a,b索引的值a[1,3,5],b[2,4,6],3 > 2,所以c=[1,2,…], b的索引+1。
第三步比較a,b索引的值a[1,3,5],b[2,4,6],3 < 4,所以c=[1,2,3,…], a的索引+1。
第四步比較a,b索引的值a[1,3,5],b[2,4,6],5 > 4,所以c=[1,2,3,4…], b的索引+1。
第五步比較a,b索引的值a[1,3,5],b[2,4,6],5 < 6,所以c=[1,2,3,4,5…],a的索引+1。
此時a中元素已全部取完,後續只需將b中元素按次序放入c即得c[1,2,3,4,5,6]
分解:將序列分為兩組a,b,再對a,b各自分成兩組。依次類推,當每組中只有乙個元素時,可認為每個小組都是有序的。
歸併:將步驟1中分成的小組,遞迴的進行兩兩歸併,直到歸併為乙個陣列。
來自維基百科
/// 歸併,將兩個有序序列合併為乙個有序序列
///private
static
void
merge(int s, int first, int mid, int last) else
}while (i <= mid)
while (j <= last)
array.copy(temp, 0, s, first, temp.length);
}
def
merge_sort
(s):
#python
if len(s) <= 1:
return s
mid = len(s) // 2
left = merge_sort(s[:mid])
right = merge_sort(s[mid:])
#注意:並非原地排序,是新建了乙個列表並返回
return merge(left, right)
defmerge
(left, right):
result =
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
i += 1
else:
j += 1
result += left[i:]
result += right[j:]
return result
五 歸併排序
歸併排序,首先需要用到遞迴,遞迴這個東西說難不難,說簡單也挺煩的。遞迴從 直觀的表現來看,就是自己呼叫自己。比如這樣 public int recursive int a 這樣就是乙個遞迴,但是問題是這樣會無線遞迴下去。所以必須給他乙個出口 public static void main strin...
排序 五 之歸併排序
歸併排序是乙個相當 穩定 的演算法對於其它排序演算法,比如希爾排序,快速排序和堆排序而言,這些演算法有所謂的最好與最壞情況。而歸併排序的時間複雜度是固定的,它是怎麼做到的?首先來看歸併排序要解決的第乙個問題 兩個有序的陣列怎樣合成乙個新的有序陣列,比如陣列1 3,5,7,8 陣列2為 1,4,9,1...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...