归并排序js

思路:用递归调用将数组不断地二分(左右都二分),直到分成一个个单个元素时返回,这以后的每一层都调用一个merge函数:将左右两部分(左指针到中指针,中指针+1到右指针)排成升序的一个整体。最终会将整个数组排xu为升序。用一个图来说明:序

图中从最底层的递归返回开始说起,每一层的执行顺序及执行内容就是该层右边的说明。其中,具体的排序逻辑需结合代码中的merge函数来看:

if (nums.length < 2) return nums

    function sort(arr, l, r) {
        if (l == r) return  //递归返回

        let mid = l + (Math.floor((r - l)/2))  //取中间
        sort(arr, l, mid)  //进入左半部分递归
        sort(arr, mid + 1, r)  //进入右半部分递归
        merge(arr, l, r,mid)  //将左右部分排序
    }

    function merge(arr, l, r,m) {
        let help = []  
        let p1 = l
        let p2 = m + 1  //由sort函数里传入的指针确定当次排序的左右两部分
        let i = 0
        while (p1 <= m && p2 <= r) {
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++] //左右两部分双指针比较,小的放入新数组
        }
        while (p1 <= m) {
            help[i++] = arr[p1++]
        }
        while (p2 <= r) {
            help[i++] = arr[p2++]
        }
        for (let j = 0; j < help.length; j++) {
            arr[j + l] = help[j]  //元素组中对应元素修改为新数组中元素
        }
    }
    sort(nums, 0, nums.length - 1)
    return nums

 总结一下,我觉得归并排序的思想在于:

从上到下:每次二分都会确定一个新的左中右范围,然后调用排序函数对该范围里的左右两部分排序

从下到上:每一层排序时,其左右两部分在下层的排序中都已被排序为有序,则最后一次排序会将整个数组排好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值