遞迴與分治 歸併排序

2021-07-24 11:50:54 字數 836 閱讀 3266

描述

給定乙個數列,用歸併排序演算法把它排成公升序。

輸入 第一行是乙個整數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...