目錄
一、概述
二、**分析
三、耗時分析
四、複雜度及穩定性分析
一、概述
思想:
歸併排序(merging sort)利用歸併思想實現的排序演算法,原理是:
假定初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩合併,得到 n/2個長度為2或1的有序子串行;然後再兩兩合併,……,如此重複,直至得到乙個長度為n的有序序列位置,這種排序演算法稱為二路歸併演算法。
#include #include #include // 隨機數種子
#include // 統計執行時間需要
using namespace std;
using namespace chrono;
#define run_sort(func) \
templatevoid merge(vector& vec, int beginpos, int midpos, int endpos)
for (j = 0; j < rightlen; j++)
i = j = 0;
k = beginpos;
// 接下來從左右兩陣列比較合併
while (i < leftlen && j < rightlen)
else
}for (; i < leftlen; i++) // 如果左陣列還有剩餘,則將剩餘元素合併到vec
for (; j < rightlen; j++) // 如果右陣列還有剩餘,則將剩餘元素合併到vec
delete leftarr;
delete rightarr;
}templatevoid mergesort(vector& vec, int beginpos, int endpos)
}templatevoid printvec(const vector& vec)
cout << "\n\n";
}int main()
cout << "************第[ "<linux和windows跑出效果:
可以看出,windows計時對於納秒級別不是很精準,linux計時比較有參考性。
時間複雜度:o(nlogn).
空間複雜度:由於歸併過程中需要與原始記錄序列同樣數量的儲存空間存放歸併結果,以及遞迴時深度為log2n的棧空間,因此空間複雜度為o(n + logn)。
穩定性:歸併排序需要兩兩比較,不存在「跳躍」,是一種穩定的排序演算法(關於排序演算法穩定性,通俗的講就是能保證在排序前,兩個相等的數在序列中先後位置順序和排序後他們倆前後位置順序相同。)。
歸併排序分析
歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 網上一張圖 可以看到這種結構很...
歸併排序實現
1,我認為歸併排序是分治思想的運用,先是把要排序的數列分成兩半,分別對這兩半進行歸併排序,一步步分下去,當分到規模為1時,開始合併兩個已經有序的陣列。2,主要的 是兩個已經有序的陣列的合併,其中涉及的有空間申請的問題和哨兵的使用。具體看 這是初寫的 存在的問題有每次迭代都申請了空間且沒釋放,而且沒有...
歸併排序實現
看到個帖子寫的歸併排序,記錄一下,特別是對鍊錶的使用。歸併的排序分為三步走 1 分割,2 遞迴,3 合併。陣列歸併排序 歸併排序三步走 1 分割子問題 2 遞迴 3 合併子問題。include stdafx.h includeusing namespace std void mergearray i...