分治法的思想:將原問題分解爲幾個規模較小但相似於原問題的子問題,遞歸求解這些子問題,而後再合併這些子問題的解來創建原問題的解。主要包括三個主要步驟:一、分解原問題 ;二、解決子問題;三、合併子問題的解ios
歸併排序遵循分治模式,算法的時間複雜度是O(NlogN),屬於穩定排序。直觀操做爲:算法
分解:分解待排序的n個元素的序列成各具備n/2個元素的兩個子序列。數組
解決:使用歸併排序遞歸地排序兩個子序列。ide
合併:合併兩個已排序的子序列以產生已排序的答案。函數
具體算法由一個輔助函數和一個遞歸函數組成:測試
函數代碼:spa
#include<iostream> using namespace std; #define INF 65535 template<class T> void Merge(T *A, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; T *L = new T[n1 + 1]; T *R = new T[n2 + 1]; for (int i = 0; i<n1; i++){ L[i] = A[p + i]; } for (int j = 0; j<n2; j++){ R[j] = A[q + j + 1]; } L[n1] = INF; R[n2] = INF; int i = 0,j = 0; for (int k = p; k <= r; k++) { if (L[i] <= R[j]) { A[k] = L[i]; i++; } else{ A[k] = R[j]; j++; } } delete[]L; delete[]R; } //二分歸併排序 template<class T> void MergeSort1(T *A, int p, int r) // p r 均是元素下標 { if (p<r) { int q = (p + r) / 2; MergeSort1(A, p, q); MergeSort1(A, q + 1, r); Merge(A, p, q, r); } }
測試代碼:code
int main() { int arry[] = { 210, 12, 9, 1, 5, 8, 19, 4, 7, 10,15,17,21,41,51,61,81,71,91,100 }; MergeSort1<int>(arry, 0, 19); //調用時,是數組首元素和末尾元素下標 for (int i = 0; i < 20; i++) cout << arry[i] << " "; cout << endl; cout << "BigThink" << endl; system("pause"); return 0; }