归并排序的原理与实现?和快排的区别?
思想:分治 + 合并。先递归拆到单元素,再「两路有序合并」。
function mergeSort(arr) {
if (arr.length <= 1) return arr
const mid = arr.length >> 1
const left = mergeSort(arr.slice(0, mid))
const right = mergeSort(arr.slice(mid))
return merge(left, right)
}
function merge(a, b) {
const out = []
let i = 0, j = 0
while (i < a.length && j < b.length)
out.push(a[i] < b[j] ? a[i++] : b[j++])
return out.concat(a.slice(i), b.slice(j))
}| 对比 | 快排 | 归并 |
|---|---|---|
| 平均 | O(n log n) |
O(n log n) |
| 最坏 | O(n^2) |
O(n log n)(稳定) |
| 空间 | O(log n) |
O(n) |
| 稳定性 | 不稳定 | 稳定 |
归并适合链表排序(无需额外空间改指针)。