演算法複習之兩路歸併排序

2021-07-03 17:17:35 字數 1277 閱讀 3236

兩路歸併排序

最差時間複雜度:o(nlogn)

平均時間複雜度:o(nlogn)

最差空間複雜度:o(n)

穩定性:穩定

兩路歸併排序(merge sort),也就是我們常說的歸併排序,也叫合併排序。它是建立在歸併操作上的一種有效的排序演算法,歸併操作即將兩個已經排序的序列合併成乙個序列的操作。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

歸併操作的基本步驟如下:

1.申請兩個與已經排序序列相同大小的空間,並將兩個序列拷貝其中;

2.設定最初位置分別為兩個已經拷貝排序序列的起始位置,比較兩個序列元素的大小,依次選擇相對小的元素放到原始序列;

3.重複2直到某一拷貝序列全部放入原始序列,將另乙個序列剩下的所有元素直接複製到原始序列尾。

設歸併排序的當前區間是r[low..high],分治法的三個步驟是:

1.分解:將當前區間一分為二,即求**點

2.求解:遞迴地對兩個子區間r[low..mid]和r[mid+1..high]進行歸併排序;

3.組合:將已排序的兩個子區間r[low..mid]和r[mid+1..high]歸併為乙個有序的區間r[low..high]。

遞迴的終結條件:子區間長度為1(乙個記錄自然有序)。

#include

void prin(int *list,int len)

/**將資料歸併

*params list:待排序的陣列,low: 乙個子塊的

*/void mergesort(int *list,int low,int mid,int high)

for(;i//剩餘left中的元素新增到陣列中

list[k++] = left[i] ;

for(;j//剩餘right中的元素新增到陣列中

list[k++] = right[j++] ;

delete left;//**空間

delete right;//**空間}/*

*歸併排序法

*list待排序的陣列,low:操作元素的位置,high:待操作元素的位置

*/void mergesort1(int *list,int low,int high)

}int main()

; mergesort1(a,0,sizeof(a)/sizeof(int)-1) ;

prin(a,10) ;

system("pause") ;

return

0 ;}

資料結構 排序 兩路歸併排序演算法

歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完...

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

二路歸併排序演算法

將兩個按值有序序列合併成乙個按值有序序列,則稱之為二路歸併排序,下面有自底向上和自頂向下的兩種排序演算法,自頂向下的排序在本文末講述,使用遞迴實現,較簡潔,經供參考。1.歸併子演算法 把位置相鄰的兩個按值有序序列合併成乙個按值有序序列。例如把序列 x s.u 和 序列 x u 1.v 合併成序列 z...