描述
給定乙個數列,用歸併排序演算法把它排成公升序。
輸入 第一行是乙個整數n(n不大於10000),表示要排序的數的個數;
下面一行是用空格隔開的n個整數。
輸出 輸出排序後的數列,每個數字佔一行。
輸入樣例 5
3 2 1 4 5
輸出樣例 1
2345
基本思路:歸併排序是將一組無序的數列,先一分為二,再將分過的繼續一分為二……直到最後剩2個數字,然後將兩個數字合併,然後將兩個有序的兩組數再合併……直到最後整個數列有序。其中關鍵的函式是merge()和mergesort()。**如下,已經經過測試。
#include using namespace std;
int a[10001],b[10001],n; //b為輔助陣列, 暫時儲存要排序的部分數字
void mergesort(int low, int high);
void merge(int low, int mid, int high);
int main()
mergesort(0, n-1);
for(int i = 0; i < n; i++)
}void mergesort(int low, int high)
}void merge(int low, int mid, int high)
while (i <= mid)
while(j <= high)
for(i = low; i <= high; i++)
a[i] = b[i]; //要將已排好序的陣列賦值給原陣列,使原陣列有序;
}
ACM 歸併排序與快速排序(遞迴與分治)
歸併排序的內容可在紫書p226裡面檢視,紫書裡的 寫得十分簡潔,高效,重點要理解好循壞條件的控制。快排可參考以下的部落格 歸併排序時間複雜度 o nlogn 快排時間複雜度 平均o nlogn 最慢o n 2 歸併排序穩定但佔空間比較大,快排佔空間較小但不穩定。以下為 實現 includeusing...
分治法之歸併排序(遞迴 分治)
歸併排序 思想 1.分而治之,將乙個無序的數列一直一分為二,直到分到序列中只有乙個數的時候,這個序列肯定是有序的,因為只有乙個數,然後將兩個只含有乙個數字的序列合併為含有兩個數字的有序序列,這樣一直進行下去,最後就變成了乙個大的有序數列 2.遞迴的結束條件是分到最小的序列只有乙個數字的時候 時間複雜...
歸併排序演算法 分治 雙遞迴
歸併排序運用分治演算法與遞迴思想,那麼其雙遞迴究竟是怎樣的呢?今天被困擾了一會一直覺得並沒有完全理解,後通過思考以及查閱資料,弄懂了其遞迴的真正實現過程!寫給已了解歸併排序的coder code void merge int r,int r1,int s,int m,int t 歸併子串行 whil...