歸併排序是分治法的典型應用,思想如下:
divide:divide the array to 2 subarray
conquer:reverse in 2 subarray,if only one elem ,return
combine:merge two ordered subarray
t(n) = 2 t(n / 2) + o (n)
o(n)指的是combine所消耗的時間,其實是兩個子陣列長度和,因為需要遍歷兩個子陣列進行合併,假設兩個子陣列的長度分別是 m 和 n, 那麼 merge(x, y)的時間複雜度為 o(m + n),即線性的,忽略常數項,即 o(n)
根據t(n)的通項公式,可解得到,t(n)= o(n * lgn)
其中,merge的過程也可以遞迴進行解決,這篇部落格中是利用迭代解決的。
vectormergesort(vectora, int start, int end)
}vectormerge(const vector& a, const vector& b ) else
} if(j >= b.size())
c.push_back(a[i]); }
if( j < b.size())
return c;
}
測試截圖:
後記:歸併排序的思路非常簡單,演算法也不難。實現起來細節還是挺多的:
1. merge過程中,兩個有序陣列合併,跳出迴圈時,可能其中有乙個陣列未遍歷完畢,需要追加到後面。
2. merge時候,注意 i 和 j ,迭代過程的控制。
分治法,歸併排序
1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...
分治法(歸併排序)
分治法.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define max 30 using namespace std int l max int r max void merge int a,int p,int q,int ...
分治法 歸併排序
分治法的思想就是把乙個難以解決的大問題分解成很多個小規模的問題 分而治之,說實話我不明白和dp的區別 name author 流照君 date 2019 9 13 11 03 29 description include include include include define inf 1001...