資料結構 歸併排序

2021-10-23 09:43:12 字數 1980 閱讀 3884

1 基本思想

歸併排序(merge-sort)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

2 演算法步驟

2.1 遞迴版歸併排序

先對區間進行均分,均分成左右兩半側,遞迴排左半側,遞迴排右半側,將左右兩半側歸併起來。

歸併是指將兩個有序區間合併成乙個有序區間。

2.2 迴圈版歸併排序

類似於將平衡二叉樹倒置,每層設定gap將資料劃分好(gap=1,2,4…),然後進行合併排序。假如有10個資料,當gap=2時,會剩下一組(兩個)資料無法匹配,這時無需任何操作,往下照搬就行了。

3 **實現

遞迴版歸併排序

//兩個陣列合併成乙個有序陣列

void

mergedata

(int array,

int left,

int mid,

int right,

int temp)

//[left,mid)區間中的資料還沒有搬移完

while

(index1 < mid)

//[mid,right)區間中的資料還沒有搬移完

while

(index2 < right)

}//設定_mergesort函式是因為往後呼叫mergesort函式時可減少引數的輸入,方便使用者

void

_mergesort

(int array,

int left,

int right,

int temp)

}void

mergesort

(int array,

int size)

迴圈版歸併排序

void

mergedata

(int array,

int left,

int mid,

int right,

int temp)

//[left,mid)區間中的資料還沒有搬移完

while

(index1 < mid)

//[mid,right)區間中的資料還沒有搬移完

while

(index2 < right)

}void

mergesortnor

(int array,

int size)

//同上

if(right>size)

//[left,mid)和[mid,right)每個分組中有gap個資料

mergedata

(array, left, mid, right, temp);}

memcpy

(array, temp, size*

sizeof

(array[0]

)); gap *=2

;}free

(temp)

;}

4 特性歸併的缺點在於需要o(n)的空間複雜度,歸併排序的思考更多的是解決在磁碟中的外排序問題。

時間複雜度:o(n*logn)

空間複雜度:o(n)

穩定性:穩定

資料結構 歸併排序

排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...

資料結構 歸併排序

歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...

資料結構 歸併排序!!!

歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...