將陣列分成兩半,然後分別對其排序
在將兩部分在分別分成兩半,然後對其排序
直到每部分只剩下乙個元素
最後再使用遞迴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...