归并排序

归并实现原理-拆分

比如数组 [1, 5, 6, 2, 4, 3],归并排序的第一步,将数组一分为二: [1, 5, 6], [2, 4, 3],接着将分成的数组继续一分为二,直到长度为一,我们构成如下二叉树(成树 从上往下)

归并实现原理-归并

当递归到了尽头,我们向上回溯,对于两个有序的数组,我们将它们合并成一个有序数组,从而完成整个归并排序(归并 从下往上)
在这里插入图片描述

// 拆分
function mergeSort(arr) {
    var mid = Math.floor(arr.length / 2)
    var left_arr = arr.slice(0, mid)
    var right_arr = arr.slice(mid)
    return merge(left_arr, right_arr)
}
// 归并
function merge(left, right) {
    var result = [] // 作为中间容器临时存放
    if(left[0] < right[0]){
        result.push(left.shift()) // shift返回数组第一个元素
    } else {
        result.push(right.shift())
    }
    return result.concat(left).concat(right)
}
var arr = [6,4]
console.log(mergeSort(arr))

控制台输出
在这里插入图片描述
但输入三个值后,需要继续拆分,使用递归

// 拆分
function mergeSort(arr) {
    if (arr.length == 1) {
        return arr
    }
    var mid = Math.floor(arr.length / 2)
    var left_arr = arr.slice(0, mid)
    var right_arr = arr.slice(mid)
    return merge(mergeSort(left_arr), mergeSort(right_arr))
}
// 归并
function merge(left, right) {
    var result = [] // 作为中间容器临时存放
    while (left.length > 0 && right.length > 0) {
        if (left[0] < right[0]) {
            result.push(left.shift())
        } else {
            result.push(right.shift())
        }
    }
    return result.concat(left).concat(right)
}
var arr = [6, 8, 2, 3, 4]
console.log(mergeSort(arr))

控制台输出
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

callmeCassie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值