归并是递归加合并,它是典型的分而治之算法
    分:将数组分成若干组
    治:两个组正确排序
    并:合并成一个数组
    image.png
    总结为:

    1. 将数组划分成若干组,每个数字分为一个组
    2. 将若干个组两两合并,保证合并后的组是有序的
    3. 重复第二步骤直到只剩下一组,排序完成
    1. const arr = [1,3,5,7,0];
    2. /**
    3. * 归并排序
    4. * 归:递归
    5. * @param {*} arr
    6. * @returns
    7. */
    8. function mergeSort(arr) {
    9. // 出口 分成一个数字一组
    10. if(arr.length < 2) return arr;
    11. // 将其一分为二
    12. let mid = arr.length >> 1;
    13. // 左序列
    14. let left = mergeSort(arr.slice(0, mid));
    15. // 右序列
    16. let right = mergeSort(arr.slice(mid));
    17. // 归并的并
    18. return merge(left, right);
    19. }
    20. /**
    21. * 归并排序中的并
    22. * @param {*} leftArr
    23. * @param {*} rightArr
    24. * @returns
    25. */
    26. function merge(leftArr, rightArr) {
    27. const result = [];
    28. let l = 0;
    29. let r = 0;
    30. // 治 将其排序
    31. while (l < leftArr.length && r < rightArr.length) {
    32. if (leftArr[l] <= rightArr[r]) {
    33. result.push(leftArr[l++]);
    34. } else {
    35. result.push(rightArr[r++]);
    36. }
    37. }
    38. // 是否有遗漏的值
    39. if(l < leftArr.length) {
    40. result.push(...leftArr.slice(l))
    41. } else {
    42. result.push(...rightArr.slice(r))
    43. }
    44. return result;
    45. }
    46. console.log(mergeSort(arr));

    参考文章:https://juejin.cn/post/6844903937242300430?share_token=a48c5011-e96a-4226-a54d-5c6240cebdf8