[编程题] 归并排序
原理:递归拆分数组到容量为1的两区间,然后两两比较,再合并回来。
单步视频图文教学: https://www.youtube.com/watch?v=4VqmGXwpLqc
function mergeSort(arr: number[]): number[] {
// 递归退出条件
if (arr.length < 2) {
return arr
}
// 拆分数组
const mid = Math.ceil(arr.length / 2)
const a1 = mergeSort(arr.slice(0, mid))
const a2 = mergeSort(arr.slice(mid))
// 合并
return merge(a1, a2)
}
function merge(a1: number[], a2: number[]): number[] {
const arr: number[] = [];
while (a1.length && a2.length) {
if (a1[0] < a2[0]) {
arr.push(a1.shift() as number)
} else {
arr.push(a2.shift() as number)
}
}
if (a1.length) arr.push(...a1)
if (a2.length) arr.push(...a2)
return arr
}
const arr = [133, 73, 327, 736, 731, 885, 605, 530, 959, 268]
console.log(mergeSort(arr)) // [73, 133, 268, 327, 530, 605, 731, 736, 885, 959]

浙公网安备 33010602011771号