归并排序是四大分类排序算法之一,也是面试常考到的问题。
归并排序思想:
将数组递归拆分成两个数组,每执行一次拆分,同时也执行一次排序合并,即拆分多少次,就排序合并多少次,最后结果为一个有序数组。要注意,拆分的最小数组只有一个数字。
动图演示如下:
实现代码如下:
let numbers = [54, 68, 12, 34, 3, 2, 5, 61, 5, 4, 84, 94, 5687];
function mergeAndSort(leftArr, rightArr) {
let result = [];
while (leftArr.length > 0 && rightArr.length > 0) {
if (leftArr[0] < rightArr[0]) {
result.push(leftArr.shift());
} else {
result.push(rightArr.shift());
}
}
return result.concat(leftArr).concat(rightArr);
}
function separateFunc(arr) {
if (arr.length <= 1) return arr;
let len = arr.length;
let middle = Math.floor(len / 2);
let left = arr.slice(0, middle);
let right = arr.slice(middle);
return mergeAndSort(separateFunc(left), separateFunc(right));
// 递归拆分,且每执行一次拆分就要执行一次排序合并
}
console.log(separateFunc(numbers));