归并是递归加合并,它是典型的分而治之算法
分:将数组分成若干组
治:两个组正确排序
并:合并成一个数组
总结为:
- 将数组划分成若干组,每个数字分为一个组
- 将若干个组两两合并,保证合并后的组是有序的
- 重复第二步骤直到只剩下一组,排序完成
const arr = [1,3,5,7,0];
/**
* 归并排序
* 归:递归
* @param {*} arr
* @returns
*/
function mergeSort(arr) {
// 出口 分成一个数字一组
if(arr.length < 2) return arr;
// 将其一分为二
let mid = arr.length >> 1;
// 左序列
let left = mergeSort(arr.slice(0, mid));
// 右序列
let right = mergeSort(arr.slice(mid));
// 归并的并
return merge(left, right);
}
/**
* 归并排序中的并
* @param {*} leftArr
* @param {*} rightArr
* @returns
*/
function merge(leftArr, rightArr) {
const result = [];
let l = 0;
let r = 0;
// 治 将其排序
while (l < leftArr.length && r < rightArr.length) {
if (leftArr[l] <= rightArr[r]) {
result.push(leftArr[l++]);
} else {
result.push(rightArr[r++]);
}
}
// 是否有遗漏的值
if(l < leftArr.length) {
result.push(...leftArr.slice(l))
} else {
result.push(...rightArr.slice(r))
}
return result;
}
console.log(mergeSort(arr));
参考文章:https://juejin.cn/post/6844903937242300430?share_token=a48c5011-e96a-4226-a54d-5c6240cebdf8