歸併排序法及優化

2021-10-09 07:38:47 字數 1039 閱讀 2578

將陣列分成兩半,然後分別對其排序

在將兩部分在分別分成兩半,然後對其排序

直到每部分只剩下乙個元素

最後再使用遞迴merge兩邊的陣列。

merge時,需要借助三個指標。

乙個指向左半部分;乙個指向右半部分;乙個指向輔助陣列。

class solution 

int j = low;

// 左半部分指標

int k = mid+1;

// 右半部分指標

for(

int i = low; i <= high; i++

)else

if(k > high)

else

if(temp[j-low]

< temp[k-low]

)else}}

void

mergesort

(vector<

int>

& arr,

int low,

int high)

// 切分為[low,mid], [mid+1,high]

int mid =

(low+high)/2

;mergesort

(arr, low, mid)

;mergesort

(arr, mid+

1, high)

;// 改進方法,如果arr[mid]<=arr[mid+1],說明已經有序了(特別是對於有序陣列)

if(arr[mid]

>arr[mid+1]

)}vector<

int>

sortarray

(vector<

int>

& nums)

};

改進方法:

通用改進方法,在遞迴到數量小到一定程度時,使用插入排序。因為插入排序(n^2和nlogn差不多),且有序的概率更高。

對於merge, 改進方法,如果arr[mid]<=arr[mid+1],說明已經有序了(特別是對於有序陣列),這時不需要merge

演算法 歸併排序及優化

歸併排序是四大分類排序演算法之一,也是面試常考到的問題。歸併排序思想 將陣列遞迴拆分成兩個陣列,每執行一次拆分,同時也執行一次排序合併,即拆分多少次,就排序合併多少次,最後結果為乙個有序陣列。要注意,拆分的最小陣列只有乙個數字。演示如下 實現 如下 let numbers 54,68,12,34,3...

3 3 歸併排序法的優化

3 3 歸併排序法的優化 1 在mergeoftwosortarray對兩個有序的陣列進行歸併的時候,如果兩個陣列合併之前就是有序的陣列,就不用再複製來複製去的了 2 在歸併的子過程中,如果待排序的陣列元素個數很少的情況下,可以使用插入排序,因為插入排序對於近乎有序的陣列而言,可以提前終止迴圈,從而...

歸併排序法

之前覺得這個很難,後來看了一些部落格,理解了之後總算是懂了。算是之前的補充。並且今天筆試有排序演算法,正好做個記錄,加深映象 歸併排序的核心是分而治之,先分開,再兩兩合併,合併的時候調整順序。例如 待排序序列 4 8 5 3 9 6 2 4 第一次分 4 8 5 3 9 6 2 4 第二次分 4 8...