mergeSort(arr: number[]) {
return split(arr, 0, arr.length - 1)
}
/**
* 将数组进行递归分割,直至无法分割后,再进行排序
* @param arr
* @param left
* @param right
*/
split(arr: number[], left: number, right: number) {
let mid = Math.floor((left + right) / 2)
if (left < right) {
split(arr, left, mid)
split(arr, mid + 1, right)
merge(arr, left, mid, right)
}
return arr
}
/**
* 将两个分割的排序数组,按从小到大的顺序进行合并
* @param arr
* @param left
* @param mid
* @param right
*/
merge(arr: number[], left: number, mid: number, right: number) {
const temp: number[] = []
let i = left
let j = mid + 1
// 进行合并排序
while (i <= mid && j <= right) {
if (arr[i] > arr[j]) {
temp.push(arr[i])
i++
} else {
temp.push(arr[j])
j++
}
}
// 当两个子数组长度不一致时,将剩余部分添加
while (i <= mid) {
temp.push(arr[i])
i++
}
while (j <= right) {
temp.push(arr[j])
j++
}
// Copy 排序后的合并数组到原数组
for (let m = left; m <= right; m++) {
arr[m] = temp.shift()!
}
}
swap(arr: number[], i: number, j: number) {
let temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
思路:
使用到了递归,先进行拆解,然后再进行合并。
递归拆分就不赘述了,合并两个有序数组使用的是双指针法,具体如下图。