資料結構與演算法 歸併排序

2021-10-04 23:20:45 字數 1545 閱讀 9344

你可以在 的 mer 標籤中看到歸併排序的動畫。

歸併排序:

時間複雜度:o(nlogn)

空間複雜度:o(n)

基本思想:

分治思想。

8 6 2 3 1 5 7 4

分:8 6 2 3 | 1 5 7 4

分:8 6 | 2 3 | 1 5 | 7 4

分:8 | 6 | 2 | 3 | 1 | 5 | 7 | 4

並:8 | 6 | 2 | 3 | 1 | 5 | 7 | 4

並:6 8 | 2 3 | 1 5 | 4 7

並:2 3 6 8 | 1 4 5 7

並:1 2 3 4 5 6 7 8

首先在分的時候,對於乙個 8 個陣列陣列,分解成了 o(log8) 也就是 3 層

每一層進行排序後向上合併即可。這個合併的過程就是合併兩個有序的陣列。

合併兩個有序陣列可以做到 o(n) 級別的合併。

leetcode 的 88 題:

實現:

void

__merge

(int arr,

int l,

int mid,

int r)

int i = l, j = mid +1;

for(

int k = l; k <= r; k++

)else

if(j > r)

else

if(tmp[i - l]

< tmp[j - l]

)else}}

void

__mergesort

(int arr,

int l,

int r)

void

mergesort

(int arr,

int n)

優化

當元素已經有序了的時候,可以不再進行__merge操作。

void

__mergesort

(int arr,

int l,

int r)

}

測試:

100 k個隨機數字:

歸併排序        :       0.022311 s

插入排序 : 7.63138 s

100 k個接近有序數字:

歸併排序        :       0.001231 s

插入排序 : 0.000419 s

可以看到,接近有序的情況下,歸併排序的時間耗費比插入排序高。

因為在接近有序的情況下,歸併排序也會進行操作,分的操作是 o(logn) 的。但是插入排序在接近有序情況下時間複雜度接近 o(n)。

eof

資料結構與演算法 歸併排序

include include include string include include include include algorithm using namespace std void merge vector input,int left,int mid,int right,vector...

資料結構與演算法(歸併排序)

歸併排序是採用分治法的乙個典型的應用,歸併排序的思想就是先遞迴分解陣列,在合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的前面的數,誰小就先取誰,取了後相應的指標就往後移一位,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。def merge sort alis...

資料結構與演算法 歸併排序

遞迴結束判斷 if size 1 return int temp int malloc n1 n2 sizeof int free temp 防止棧溢位 遞迴太深 在網上查了半天發現是函式名寫錯了,太不認真了!用遞迴實現 一定要有結束條件 void merging int a,int n1,int ...