作用
思想
- 分治,将整个数组不断地通过递归划分为两部分,直到长度为 2,再不断地进行合并,最终得到有序数组
代码
function mergeSort(arr, l, r) {
if (l >= r) return
const mid = (l + r) >> 1
mergeSort(arr, l, mid)
mergeSort(arr, mid + 1, r)
const temp = []
let k = 0,
p1 = l,
p2 = mid + 1
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && arr[p1] <= arr[p2])) {
temp[k++] = arr[p1++]
} else {
temp[k++] = arr[p2++]
}
}
for (let i = l; i <= r; i++) {
arr[i] = temp[i - l]
}
}
小分析
- 是否稳定,因为我们合并的时候,保证了
arr[p1] <= arr[p2] 合并 p1 索引元素,所以是稳定的
- 是否原地,不是,因为有
temp 需要额外空间