將兩個有序表合成乙個新的有序表就是二路歸併。例如,在元素序列l中有兩個已經排好序的有序順序表l[
left
],..
.,l[
mid]
和l[m
id+1
],..
.,l[
righ
t],它們可以歸併成為乙個有序表,仍然存放於l[
left
],..
.,l[
righ
t]中。
在歸併排序中,用變數
i 和
j分別做
l 中兩個表的當前檢測指標,用變數
k做歸併後結果表l1
的當前存放指標。當
i 和
j都在兩個表的表長內變化時,根據相應的兩個元素的排序碼大小,依次把排序碼小的元素放到結果表中;當
i 與
j中有乙個已經超出表長時,將另乙個表中的剩餘部分照抄到結果表中。
來自:
//歸併排序標頭檔案
#pragma once
#include
typedef
int elementtype;
class merge
;merge::merge(int length)
inline
void merge::create()
std::cout
<< "input successful"
<< std::endl;
}inline
void merge::sort() //歸併排序,不斷的增大塊的大小,從1開始,一直到大於等於len
}inline
void merge::print()
std::cout
<< std::endl;
}merge::~merge()
inline
void merge::mergehelp(elementtype *&l1, elementtype *&l2, int left, int mid, int right) //兩個小塊進行合併,left是左塊的開始,mid是兩塊的分界線,right是右塊的盡頭
else
}while (i <= mid)
while (j <= right)
}inline
void merge::mergepass(elementtype *&l1, elementtype *&l2, int l) //l是歸併排序中每個子排序表的初始長度
if (i + l <= len - 1) //如果第二個表長不足l
else
//如果只剩下乙個表,直接複製就好}}
//歸併排序main檔案
圖示
//遞迴歸併排序標頭檔案
#pragma once
#include
typedef
int elementtype;
class merge
;merge::merge(int length)
inline
void merge::create()
std::cout
<< "input successful"
<< std::endl;
}inline
void merge::print()
std::cout
<< std::endl;
}inline
void merge::recursivesort()
inline
void merge::recursivesorthelp(int left, int right) //分治法
}}merge::~merge()
inline
void merge::mergehelp(elementtype *&l1, elementtype *&l2, int left, int mid, int right) //每兩個小塊進行合併
else
}while (i <= mid)
while (j <= right)
}
//遞迴歸併排序main檔案,採用分治法
mergepass做一趟二路歸併排序呼叫mergehelp函式2l
n 次,其中
l 是需要歸併子串行的長度,
n是整個序列的長度。而mergesort呼叫mergepass正好
⌈log2n
⌉ 次,而每次做mergehelp要執行比較o(
l)次,所以演算法總的排序碼比較次數為o(
nlog2n
) 。不論元素初始排列如何買這個時間的代價是不變的。
使用了乙個與原待排序元素陣列相同大小的輔助陣列,空間代價為o(
n)。歸併排序是穩定的。
注:本文參考書籍《資料結構精講與習題詳解—考研輔導與答疑解惑》,殷人昆編著,清華大學出版社。
4 內部排序 歸併排序
歸併排序 歸併排序和快速排序這兩種演算法都採用了分治的思想,且速度僅次於 快速排序 為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的 數列,其具體思想如下 1 將序列每相鄰兩個數字進行歸併操作 merge 形成 n 2 個序列,排序後每個序列包含兩個元素 2 將上述序列再次歸併操作,形成 ...
排序演算法(4) 歸併排序
簡介 歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。一 主要步驟 將待排序陣列 0....
4 歸併排序演算法
1 歸併排序 merge sort 基本思想 歸併排序法是將兩個或兩個以上的有序表合併成乙個新的有序表 即將待排序的序列分成若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體子串行 利用歸併的思想實現二路歸併排序的實現步驟 首先將整個資料表看成是n個有序子表,每個子表長度為1 當然有序啦...