排序 - 归并排序
算法
复杂度
代码
function mergeSort(arr, left, right) {
// base case
if (left >= right) return 0;
const mid = Math.floor(left + (right - left) / 2);
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
function merge(arr, left, mid, right) {
// 1. 使用一个临时数组,
// 将有序的左右两部分 [left, mid] 和 [mid + 1, right] 先合并到临时数组 sortedPart 中
const sortedPart = [];
let p = left,
q = mid + 1,
s = 0;
while (p <= mid && q <= right) {
if (arr[p] <= arr[q]) {
sortedPart[s++] = arr[p++];
} else {
sortedPart[s++] = arr[q++];
}
}
while (p <= mid) {
sortedPart[s++] = arr[p++];
}
while (q <= right) {
sortedPart[s++] = arr[q++];
}
// 2. 将 sortedPart 里面的元素一一更新到原数组中的对应位置
p = 0;
q = left;
while (p < sortedPart.length) {
arr[q++] = sortedPart[p++];
}
}应用
Last updated