要求:
用遞迴實現,每次的合併操作結束後,輸出當前的排序結果。
輸入:
第一行,乙個數n,表示n個數需要排序。
第二行,輸入這n個需要排序的數字。
(注意,當n為奇數時,劃分為兩部分,前半部分為n/2+1,後半部分為n/2)
標準輸入:
99 8 7 6 5 4 3 2 1
標準輸出:
8 9 7 6 5 4 3 2 1
7 8 9 6 5 4 3 2 1
7 8 9 5 6 4 3 2 1
5 6 7 8 9 4 3 2 1
5 6 7 8 9 3 4 2 1
5 6 7 8 9 3 4 1 2
5 6 7 8 9 1 2 3 4
1 2 3 4 5 6 7 8 9
思路:(1)先將陣列劃分為乙個個塊,直到不能再劃分為止(分)
(2)對劃分的陣列進行排序
需要:(1)乙個臨時變數陣列p,儲存每次歸併後的值,然後賦給a(這個時候p處理歸併資料下標的範圍和a的下標範圍一致)
(2)乙個函式,用來分(劃分下標範圍)
(3)乙個函式,用來治(將兩組資料歸併,歸併後即為排序)
詳細請見**及注釋
1 #include2using
namespace
std;
3void mergesort(int a,int begin,int mid,int end,int n,int p) //
歸併排序
4 //
迴圈結束時,左右兩分組必有乙個沒有全部並到臨時儲存陣列p
12while(i<=mid) p[k++]=a[i++]; //
這時我們需要檢查,並把沒有並的放到p裡面
13while(j<=end) p[k++]=a[j++];
14for (int i = 0; i < (end-begin+1); i++) a[i+begin]=p[i+begin]; //
把歸併好的放到a裡
15for(int i=0;i"
"; //
輸出每一步的歸併結果
16 cout<1819
void divide_conquer(int a,int begin,int end,int n,int p) //
遞迴分治
202829}
3031
intmain()
32
歸併排序遞迴實現
include include define length 10 using namespace std void merge int ar,int br,int start,int mid,int end else if i mid else void copy int ar,int br,int...
歸併排序(遞迴實現)
演算法思想 1 歸併排序是利用遞迴與分治技術,將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列。其中 歸 代表的是遞迴的意思,即遞迴地將陣列折半地分離為單個陣列。例如,陣列 5,2,1,7 會先折半,分為 5,2 和 1,7 兩個子陣列,...
歸併排序遞迴實現
對於歸併排序,不僅有遞迴的實現方式,還有迭代的實現方式。迭代法實現歸併排序的 如下 include include define max size 10 實現歸併,並將最後的資料放入到list1中 void merging int list1,int list1 size,int list2,int...