排序演算法之(5) 歸併排序(遞迴實現)

2021-07-03 05:23:18 字數 1037 閱讀 6979

歸併排序的思想是如果子陣列l和子陣列r都是有序的,那麼我們可以將其合併為乙個有序陣列;在歸併排序中,首先將子陣列的長度設為1,此時每個元素都是乙個有序子陣列,通過兩兩合併,我們可以得到若干個長度為2的有序子陣列,然後對這些長度為2的子陣列兩兩合併,就可以得若干個到長度為4的有序子陣列……………………如此下去,最終將合併為乙個有序的陣列。

下面用乙個例子來說明:

假設有陣列a=

步驟一:(25)(5)(71)(1)(61)(11)(59)(15)(48)(19)

兩兩合併:(5,25) (1,71) (11,61) (15,59) (19,48)

步驟二:(5,25) (1,71) (11,61) (15,59) (19,48)

兩兩合併:(1,5,25,71) (11,15,59,61) (19,48)

步驟三:(1,5,25,71) (11,15,59,61) (19,48)

兩兩合併:(1,5,11,15,25,59,61,71) (19,48)

步驟四:(1,5,11,15,25,59,61,71) (19,48)

兩兩合併:(1,5,11,15,19,25,48,59,61,77)

【歸併排序的遞迴實現**】

#include

#include

using

namespace

std;

#define maxsize 100

template

void merge(t a,long p,long q,long r) //陣列合併操作

else

}else

if(ielse

}}template

void mergesort(t a,long p,long r)

}int main()

; mergesort(a,0,9);

for(i=0;i<=9;i++)

cout

<"pause");

return

0;}

排序演算法 5 歸併排序

歸併排序演算法思路 先將陣列不斷均分成兩堆,直至只有乙個元素,再兩兩進行排序合併。使用了大量了額外陣列空間,但減少了比較次數和寫操作。時間複雜度與空間複雜度將再排序演算法總結裡面討論。下面直接展示演算法 def merge sort nums nums為list型別 分解陣列直至陣列長度小於1 wh...

歸併排序 遞迴演算法

陣列排序任務可以如下完成 1 將前一半排好序 2 將後一半排好序 3 把兩半歸併到乙個新的有序陣列中,然後再拷貝回原來的陣列,排序完成 利用遞迴思想將陣列一直劃分為要排序的另一半,最後就回將問題化簡為相鄰兩個數的排序,然後將排好序的陣列歸併到乙個陣列中,然後繼續向上遞迴直至排序完成。int a 10...

歸併排序遞迴實現

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