归并排序:将数组进行二分法拆分,直到拆分至左右两侧长度为2,然后左右两侧分别进行排序,排序结束后回归到上一步的二分法拆分,重复递归至二分法拆分结束
图解(来源网络资源图片)
代码实现
// 排序实现
function sortCb(left = [], right = []){
let result = [];
while(left.length && right.length){
if(left[0] > right[0]){
result.push(right.shift())
}else{
result.push(left.shift())
}
}
// 比较完 剩余直接push
if(left.length){
result = result.concat(left)
}
if(right.length){
result = result.concat(right)
}
return result;
}
// 递归处理
function mergeSort(arr = []){
if(arr.length < 2){
return arr;
}
let middle = Math.floor(arr.length / 2);
let left = arr.slice(0,middle);
let right = arr.slice(middle);
return sortCb(mergeSort(left),mergeSort(right))
}