歸併排序的基本思想:
將兩個或兩個以上的有序子串行」歸併」為乙個有序序列:假定待排序表含有n個記錄, 則可以看成是n個有序的子表, 每個子表長度為1, 然後兩兩歸併, 得到[n/2]個長度為2或1的有序表,; 再量量歸併, ...., 如此重複, 直到合併成為乙個長度為n的有序表為止, 這種排序方法稱為2-路歸併排序.如圖為乙個2-路歸併排序的乙個示例:
/**說明:
將有序的記錄序列 initlist[left:mid] 和 initlist[mid+1:right]歸併為有序的記錄序列 initlist[left:right]
initlist: 原始的有序序列[分為兩段]
tmplist: 合併過程中需要的中間序列
left: initlist最左邊元素的下標
mid: 指向第乙個有序序列的最後乙個元素的下標
right: initlist最右邊元素的下標
*/template
<
typename
type>
intmerge(type *initlist, type *tmplist,
intleft,
intmid,
intright)
ints1 = left, s2 = mid+1;
intiresult = left;
while
(s1 <= mid && s2 <= right)
else
} int*end;
if(s1 <= mid)
end = std::copy(tmplist+s1, tmplist+mid+1, initlist+iresult);
if(s2 <= right)
end = std::copy(tmplist+s2, tmplist+right+1, initlist+iresult);
return
end - (initlist+left);
// 同下:其實這兩個迴圈只有乙個會執行
// while (s1 <= mid)
//
// while (s2 <= right)
//
//// return iresult;
}
[cpp]view plain
copy
//二路歸併排序-遞迴演算法
template
<
typename
type>
void
mergesort(type *initlist, type *tmplist,
intleft,
intright)
可以看出對n個記錄進行歸併排序的時間複雜度為ο(nlogn)。即:
(1)每一趟歸併(合併)的時間複雜度為 o(n);
(2)總共需進行[logn]趟。
資料結構基礎 5 歸併排序
歸併排序的基本思想 將兩個或兩個以上的有序子串行 歸併 為乙個有序序列 假定待排序表含有n個記錄,則可以看成是n個有序的子表,每個子表長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序表,再量量歸併,如此重複,直到合併成為乙個長度為n的有序表為止,這種排序方法稱為2 路歸併排序.如圖為乙個2...
資料結構基礎7 4 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體 有序序列。遞迴過程是將待排序集合一分為二,直至排序集合就剩下乙個元素為止,然後不斷的合併兩個排好序的陣列。include include inc...
資料結構 歸併排序
排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...