歸併排序的思想是如果子陣列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...