兩路歸併排序
最差時間複雜度: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...