常用演算法排序(04) 歸併排序

2021-10-03 19:51:49 字數 1525 閱讀 6270

歸併排序是利用先遞迴進行分解,將乙個規模為 n

nn 的問題分解成兩個規模為 n/2

n/2n/

2 的問題,再不斷的繼續進行遞迴分解成最終規模為1

11的問題。然後再逐漸的從小規模結果進行合併,最終得到完整的結果。也即分而治之的思想。

其**如下:原圖位址

歸併排序使用了空間換時間的方式,用乙個輔助陣列來儲存每次排序後的結果,然後再將其複製到原陣列對應的位置上,會將原陣列中對應位置上 的值覆蓋掉。

1、如陣列 [4,3,2,1] 的遞迴子問題為 [4,3] 和 [2,1] 其中先將 [4,3] 的排序結果放在輔助陣列 temp 中(temp的大小為原陣列 arr 的大小)。然後再將在 temp陣列中排好序的結果複製到 arr 陣列中的對應位置上,如下圖所示。遞迴這個過程就是歸併排序。

2、第一次遞迴後的排序結果如下

#include

#include

using

namespace std;

void

merge

(int

*arr,

int*temp,

int left,

int mid,

int right)

else

}while

(i <= mid)

while

(j <= right)

index =0;

while

(left <= right)

arr[left++

]= temp[index++];

}void

mergesort

(int

*arr,

int*temp,

int left,

int right)

}int

main()

;int len =

sizeof

(arr)

/sizeof

(arr[0]

);//建立乙個長度等於原陣列長度的輔助陣列,避免遞迴中頻繁開闢空間

int*temp =

newint

[len]

;mergesort

(arr,temp,

0, len-1)

;delete

temp;

for(

int i =

0; i < len;

++i)

cout << arr[i]

<<

" ";

cout << endl;

system

("pause");

return0;

}

04 歸併排序

歸併排序 顧名思義,就是不斷的將兩個有序的子串行歸併成乙個大的序列。所以核心操作就是有序子列的歸併,如果有兩個子列,共有n個元素,那麼歸併的時間複雜度是t n o n 有了歸併演算法,我們採用易於理解的方式,分而治之的思想,也就是不斷地遞迴將大的序列劃分成小的序列,當序列只有乙個元素的時候 自身有序...

常用排序演算法 歸併排序

歸併排序 基本思想 先把陣列拆分,直到分成都只含有乙個元素的陣列,這樣兩兩合併,逐漸就可以得到已排序的字陣列,繼續合併直到合併成原來陣列長度為止。時間複雜度 o nlogn 空間複雜度 o nlogn 每一輪合併都需要n空間,共需要logn輪 第一輪是1 n 需要n個陣列,每個陣列長度為1 第二輪是...

常用排序演算法 歸併排序

確定分界點 mid l r 2 取中間數,分成 l,mid 和 mid,r 兩個區域。將l l,mid 和 mid,r 兩個區域進行遞迴排序。歸併 將左右兩個有序的序列合併成乙個有序序列。給定你乙個長度為n的整數數列。請你使用歸併排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格...