前端排序算法 - 归并排序算法 (1)

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略,

(divide)成一些小的问题然后递归求解,

治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起。

 

 

代码演示gif:

 

 

归并排序算法我们采用递归的方法   先将数组一直进行折半拆分 拆到长度为一的数组  再两两合并 

比如:  [5, 6, 3, 1, 8, 7, 2, 4]

1. 先将数组一直进行折半拆分 拆到长度为一的数组 
比如 
[ 5 ] [ 6 ]  [ 3 ] [ 1 ] 
2. 再拆分的个体进行两两合并 用 merge 方法
得到 

[ 5, 6 ] 和 [ 1, 3 ]

再将这两个数组进行合并 得到 

[1, 3 , 5, 6]

这个时候左边合并完成  

进行右边拆分合并


[ 8 ] [ 7 ] 和 [ 2 ] [ 4 ] 

得到 

[2, 4 , 7 , 8 ]

所以我们这个时候得到两个数组 

[1, 3 , 5, 6] 和  [2, 4 , 7 , 8 ]

对这两个数组进行合并 得到最后结果 

1,2,3,4,5,6,7,8

白话思路:

先拆分 再合并 
先拆分左边的 拆分到个体为1  的数组再进行两两合并  得到最终结果 
接着对右边进行同样操作 
得到最终结果
这个时候左边和右边都得到长度为 n/ 2  的排序好的数组了 
最后一步 将左右两边进行merge  重新排序 

 js  的代码实现 归并排序算法:

let data = [5, 6, 3, 1, 8, 7, 2, 4]
console.log(mergeSort(data))
function mergeSort (arr) {
    var len = arr.length;
    if(len < 2) {
        return arr;
    }
    let middle = Math.floor(len/2);
    let left = arr.slice(0, middle)
    let right = arr.slice(middle)
    return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
    let result = []
    while (left.length> 0 && right.length> 0) {
        if (left[0] <= right[0]) {
           result.push(left.shift())
        } else {
            result.push(right.shift())
        }
    }
    while(left.length) 
        result.push(left.shift())
    while(right.length) 
        result.push(right.shift())
    return result;
}

 

git 地址: https://gitee.com/guangzhou110/front-end-sorting-algorithm

 

posted @ 2021-03-07 09:59  1点  阅读(195)  评论(0编辑  收藏  举报