歸併排序的C 實現 遞迴方法

2021-08-27 16:18:44 字數 1241 閱讀 2937

歸併排序演算法的基本操作是合併兩個已排序的表:對於兩個已排好序的陣列a和b、存放結果的陣列c,設定三個計數器a、b和c,它們初始時置於陣列的開始端,將a[a]和b[b]中的較小者存放在c[c]中,同時把相關的計數器向前推進一步。假設有已排序陣列a=和已排序陣列b=,初始時,a=b=c=0。比較步驟如下:

首先1和2比較,1被加入到c中,a和c自增,a=1,b=0,c=1,c=

第2次比較在3和2之間進行,2被加入到c中,b和c自增,a=1,b=1,c=2,c=

第3次比較在3和6之間進行,3被加入到c中,a和c自增,a=2,b=1,c=3,c=

第4次比較在5和6之間進行,5被加入到c中,a和c自增,a=3,b=1,c=4,c=

第5次比較在7和6之間進行,6被加入到c中,b和c自增,a=3,b=2,c=5,c=

第6次比較在7和7之間進行,7被加入到c中,a(也可以是b)和c自增,a=4,b=2,c=5,c=

此時a中的所有元素都已經被加入到c中,現在只要將b中剩餘的元素複製到c的後面就完成了有序陣列a和b的合併。最後c=。

完成兩個有序陣列(實際上是乙個陣列的兩段,已排序的前半段和已排序的後半段)合併的函式merge的實現如下:

void merge(elementtype array, elementtype tmparray,int lpos, int rpos,int rightend)

如果只有乙個元素需要排序,那麼答案是顯然的。否則,將前半部分和後半部分各自歸併排序,得到排序後的兩部分在利用上面的方法進行合併就完成了所有元素的排序。而對於前半部分和後半部分的排序亦是如此。例如有待排序陣列array=,有n=5個元素,想將其分為兩部分(),這兩個部分是無序的要再次進行歸併排序,繼續分割為(()())。此時只有乙個元素,所以不用再進行分割,其他的還要分割,最後分割為( () ) ( () () ),每乙個圓括號表示一次歸併。

第1次排序後:(( () ( ))

第2次排序後:( )

第3次排序後:

歸併排序的實現如下:

void msort(elementtype array, elementtype tmparray, int left, int right)

}

通常輸入是乙個陣列array和待排序元素個數n,所以再給出歸併排序的驅動函式如下:

void mergesort(elementtype array, int n)

C 歸併排序 遞迴實現

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

C 實現歸併排序 遞迴

今天學習第乙個時間複雜度為o nlogn 的排序演算法 歸併排序。首先給出定義 歸併 一詞的中文含義就是合併,併入的意思,而在資料結構中的定義是將兩個或者兩個以上的有序陣列組合成乙個新的有序表。歸併排序 merging sort 原理 假設初始序列含n個記錄,則可以看成是n個有序的子串行,每個子串行...

歸併排序遞迴實現

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