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 = leftlet 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}
思路:
使用到了递归,先进行拆解,然后再进行合并。
递归拆分就不赘述了,合并两个有序数组使用的是双指针法,具体如下图。

