1. mergeSort(arr: number[]) {
  2. return split(arr, 0, arr.length - 1)
  3. }
  4. /**
  5. * 将数组进行递归分割,直至无法分割后,再进行排序
  6. * @param arr
  7. * @param left
  8. * @param right
  9. */
  10. split(arr: number[], left: number, right: number) {
  11. let mid = Math.floor((left + right) / 2)
  12. if (left < right) {
  13. split(arr, left, mid)
  14. split(arr, mid + 1, right)
  15. merge(arr, left, mid, right)
  16. }
  17. return arr
  18. }
  19. /**
  20. * 将两个分割的排序数组,按从小到大的顺序进行合并
  21. * @param arr
  22. * @param left
  23. * @param mid
  24. * @param right
  25. */
  26. merge(arr: number[], left: number, mid: number, right: number) {
  27. const temp: number[] = []
  28. let i = left
  29. let j = mid + 1
  30. // 进行合并排序
  31. while (i <= mid && j <= right) {
  32. if (arr[i] > arr[j]) {
  33. temp.push(arr[i])
  34. i++
  35. } else {
  36. temp.push(arr[j])
  37. j++
  38. }
  39. }
  40. // 当两个子数组长度不一致时,将剩余部分添加
  41. while (i <= mid) {
  42. temp.push(arr[i])
  43. i++
  44. }
  45. while (j <= right) {
  46. temp.push(arr[j])
  47. j++
  48. }
  49. // Copy 排序后的合并数组到原数组
  50. for (let m = left; m <= right; m++) {
  51. arr[m] = temp.shift()!
  52. }
  53. }
  54. swap(arr: number[], i: number, j: number) {
  55. let temp = arr[i]
  56. arr[i] = arr[j]
  57. arr[j] = temp
  58. }

思路:

使用到了递归,先进行拆解,然后再进行合并。
image.png

递归拆分就不赘述了,合并两个有序数组使用的是双指针法,具体如下图。
image.png
image.png