归并的过程就是将两个有序的数组合并成一个有序的数组,要想要有有序的子数组必将先递归拆分数组,知道子数组有一个元素为止,这样就是有序的了,然后将相邻两个子数组依次合并就是归并排序。
void __merge_sorted_array(int arr[], int l, int m, int r, int tmp[]) {
int i = l, j = m + 1 ;
int k = 0 ;
while (i <= m && j <= r) {
if (arr[i] < arr[j]) {
tmp[k++] = arr[i++];
}else {
tmp[k++] = arr[j++];
}
}
while (i <= m) {
tmp[k++] = arr[i++];
}
while (j <= r) {
tmp[k++] = arr[j++];
}
for (int i = 0 ; i < k; ++i) {
arr[l + i] = tmp[i];
}
}
void __merge_sort(int arr[], int l, int r, int tmp[]) {
if (l < r) {
int m = (l + r) / 2 ;
__merge_sort(arr, l, m, tmp);
__merge_sort(arr, m + 1 , r, tmp);
__merge_sorted_array(arr, l, m, r, tmp);
}
}
bool merge_sort(int arr[], int n) {
int * p = new int [n];
if (p == NULL) {
return false ;
}
__merge_sort(arr, 0 , n - 1 , p);
delete [] p;
return true ;
}