前端排序算法 - 归并排序算法 (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
越努力越幸运