資料結構基礎 5 歸併排序

2021-07-09 17:16:27 字數 1630 閱讀 5517

歸併排序的基本思想:

將兩個或兩個以上的有序子串行」歸併」為乙個有序序列:假定待排序表含有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 ...