C 實現歸併排序 遞迴

2021-09-28 17:41:26 字數 1294 閱讀 6576

今天學習第乙個時間複雜度為o(nlogn)的排序演算法------歸併排序。

首先給出定義:

「歸併」一詞的中文含義就是合併,併入的意思,而在資料結構中的定義是將兩個或者兩個以上的有序陣列組合成乙個新的有序表。

歸併排序(merging sort)原理:假設初始序列含n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後晾涼歸併,得到[n/2]([x]表示不小於x的最小整數)個長度為2或者1的有序子串行;再兩兩歸併......,如此重複直到得到乙個長度為n的有序序列為止,這種排序方法稱為2路歸併排序。

歸併排序在最好和最壞情況下的時間複雜度均為o(nlogn),而且需要借助o(n)大小的輔助空間。歸併排序需要兩兩比較,不存在跳躍,因此歸併排序是一種穩定的排序演算法。

也就是說,歸併排序是一種比較佔記憶體,但卻效率高切穩定的演算法。

#include using namespace std;

// 將arr[l...mid]和arr[mid+1...r]兩部分進行歸併

// arr[l...mid]是有序的

// arr[mid+1...r]也是有序的

template void __merge(t arr, int l, int mid, int r)

// 我們需要建立三個陣列索引,剛開始分別指向l,mid+1,arr待放的第乙個索引

int i = l;

int j = mid + 1;

// k 是指向arr中待放merge後arr的索引

for(int k = i; k <= r; k ++)

// 這個也是同理

else if(j > r)

//else if(aux[i-l] < aux[j-l])

else

}}// 遞迴使用歸併排序, 對arr[l...r]的範圍進行排序

templatevoid __mergesort(t arr, int l, int r)

int mid = l + (r-l) / 2;

__mergesort(arr, l, mid);

__mergesort(arr, mid+1, r);

// 歸併操作,是該演算法的重點

__merge(arr, l, mid, r);

}// 歸併排序, 遞迴版本

templatevoid mergesort(t arr, int n)

我個人認為,歸併排序最重要的操作在於最後的merge操作,同時在**中可以看到的是,merge是整個程式的核心。

C 歸併排序 遞迴實現

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的乙個非常典型的應用。歸併排序中最重要的操作是如何將將二個有序數列合併。原理是比較兩個數列的第乙個數,誰小就先取誰,再繼續比較下乙個。迴圈完了後,如果有數列為空,那直接將另乙個數列的資料依次取出即可。將有序陣列a和b合併到c中 v...

歸併排序遞迴實現

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 兩個子陣列,...