归并是递归加合并,它是典型的分而治之算法
分:将数组分成若干组
治:两个组正确排序
并:合并成一个数组
总结为:
- 将数组划分成若干组,每个数字分为一个组
- 将若干个组两两合并,保证合并后的组是有序的
- 重复第二步骤直到只剩下一组,排序完成
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
