核心思想:分治法
步骤:
- 把长度为 n 的输入序列分成两个长度为 n/2 的子序列
- 对这两个子序列分别采用归并排序
- 将两个排序好的子序列合并成一个最终的排序序列
分析:
- 时间复杂度: 最坏时间复杂度是 O(nlogn),因为每次划分数组时需要 O(logn),而合并过程需要 O(n)
- 空间复杂度: 不是原地排序算法,空间复杂度是 O(n),因为需要辅助数组来合并
实现代码
function mergeSort(arr) {
if (arr.length < 2) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return result.concat(left, right);
}
let array = [5, 3, 8, 4, 2];
console.log(mergeSort(array)); // 输出: [2, 3, 4, 5, 8]