演算法4的C 實現 歸併排序

2021-09-25 06:03:59 字數 1550 閱讀 7787

將兩個的有序數列合併成乙個有序數列,我們稱之為"歸併"。

歸併排序(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...