十大排序演算法之歸併排序(MergeSort)

2021-10-03 19:30:57 字數 2114 閱讀 6096

一、前言

資料結構與演算法,順便刷leetcode,無意間發現了乙個 我覺得講解的比較好的網頁,並且會拿leetcode裡面的題目當做例題,如有需要,奉上**:五分鐘學演算法

二、演算法的介紹

分組,將序列的中的元素進行逐層折半分組,直到每組只有乙個元素。

歸併,逐層向上排列每一層的元素的順序,然後合併成更大的組,直到所有元素合併成乙個有序的序列。

合併序列時,要申請乙個新的空間,用於將兩個小序列合併成乙個序列的過渡。具體地,見圖示。

三、圖示與**(**於網路)

圖示一:折半分組

**一:折半分組

void

mergesort

(vector<

int>

&dp,

int start,

int end)

}

圖示二:序列合併

圖示三:有序序列的合併

**二:序列合併

void

merge

(vector<

int>

&dp,

int start,

int mid,

int end)

while

(p1<=mid)

tmp[p++

]=dp[p1++];

while

(p2<=end)

tmp[p++

]=dp[p2++];

for(

int i=

0;i1;i++

) dp[i+start]

=tmp[i]

;}

四、整體**

#include

#include

using

namespace std;

void

merge

(vector<

int>

&dp,

int start,

int mid,

int end)

//合併部分

while

(p1<=mid)

tmp[p++

]=dp[p1++];

while

(p2<=end)

tmp[p++

]=dp[p2++];

for(

int i=

0;i1;i++

) dp[i+start]

=tmp[i];}

void

mergesort

(vector<

int>

&dp,

int start,

int end)

}int

main()

mergesort

(arr,

0,arr.

size()

-1);

for(

int i=

0;isize()

;i++

) cout<

<

return0;

}

五、演算法效能穩定性:在元素拆分的時候,雖然相同元素可能被分到不同的組中,但是合併的時候相同元素相對位置不會發生變化,故穩定。

空間複雜度:需要用到乙個陣列儲存排序結果,也就是合併的時候,需要開闢空間來儲存排序結果,故為 o ( n );

時間複雜度:最好最壞都為 o(nlogn);

十大排序演算法 歸併排序

歸併排序是一種概念上最簡單的排序演算法,歸併排序是基於分治法的。歸併排序將待排序的元素序列分成兩個長度相等的子串行,為每乙個子串行排序,然後再將他們合併成乙個子串行。合併兩個子串行的過程也就是兩路歸併。1,申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 2,設定兩個指標,最初位...

十大排序演算法之歸併排序5

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2 路歸併。5.1 演算法描述 5.2 圖例演示...

十大排序演算法之 歸併排序 五)

將兩個有序陣列進行歸併排序 將陣列分成兩部分分別排序 遞迴 private static void mergesort int arr,int left,int right 將陣列分成兩部分 int mid left right left 2 對陣列左邊進行排序 mergesort arr,left...