歸併排序(遞迴實現)

2022-03-01 08:47:00 字數 1307 閱讀 9479

要求:

用遞迴實現,每次的合併操作結束後,輸出當前的排序結果。

輸入:

第一行,乙個數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 #include2

using

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...