將兩個的有序數列合併成乙個有序數列,我們稱之為"歸併"。
歸併排序(merge sort)就是利用歸併思想對數列進行排序。根據具體的實現,歸併排序包括"從上往下"和"從下往上"2種方式。我們在此處實現「從上往下」的歸併排序。
從上往下的歸併排序基本包括3步:
① 分解 -- 將當前區間一分為二,即求**點 mid = (low + high)/2;
② 求解 -- 遞迴地對兩個子區間a[low...mid] 和 a[mid+1...high]進行歸併排序。遞迴的終結條件是子區間長度為1。
③ 合併 -- 將已排序的兩個子區間a[low...mid]和 a[mid+1...high]歸併為乙個有序的區間a[low...high]。
歸併排序時間複雜度
歸併排序的時間複雜度是o(n*lgn)。
假設被排序的數列中有n個數。遍歷一趟的時間複雜度是o(n),需要遍歷多少次呢?
歸併排序的形式就是一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的可以得出它的時間複雜度是o(n*lgn)。
歸併排序穩定性
歸併排序是穩定的演算法,它滿足穩定演算法的定義。
演算法穩定性-- 假設在數列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個排序演算法是穩定的!
#includeusing namespace std;
template bool lessthan(const t &a, const t &b)
template void exch(t &a, t &b)
template void show(const vector&a)
template bool issorted(const vector&a)
return true;
}template void read(vector&v, const string s) }}
#pragma region mergesort
template t* aux;
template void merge(vector&a, int lo, int mid, int hi)
}template void msort(vector&a, int lo, int hi)
template void mergesort(vector&a)
#pragma endregion
#include#include#include#include#include#include#include#include"sort.h"
using namespace std;
int main()
cout << "執行時間是" << time << endl;
system("pause");
}
4 歸併排序演算法
1 歸併排序 merge sort 基本思想 歸併排序法是將兩個或兩個以上的有序表合併成乙個新的有序表 即將待排序的序列分成若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體子串行 利用歸併的思想實現二路歸併排序的實現步驟 首先將整個資料表看成是n個有序子表,每個子表長度為1 當然有序啦...
歸併排序演算法實現(C )
歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作 1 i 3 1 6 8 38 100 202 301 4 根據例子實現的演算法為 include using namespace std int a void merge array int a,int n,int...
歸併排序演算法(C 實現)
歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。歸併排序有兩種方式 1 自底向上的方法2 自頂向下的方法 1 自底向上的方法 1 自底向上的基本思想 自底向上的基本思想是 第1趟歸併排序時,將待排序的檔案r 1.n 看作是n個長度為1...