資料結構基礎 5 歸併排序

2022-04-29 19:24:11 字數 1292 閱讀 6614

歸併排序的基本思想:

將兩個或兩個以上的有序子串行」歸併」為乙個有序序列:假定待排序表含有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 int merge(type *initlist, type *tmplist, int left, int mid, int right)

int s1 = left, s2 = mid+1;

int iresult = 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;

}

//二路歸併排序-遞迴演算法

template void mergesort(type *initlist, type *tmplist, int left, int right)

可以看出對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 ...