问题描述:
归并排序是建立在归并操作系统上的一种有效排序算法,该算法采用分治法(Divide and Conquer)实现。将已有的子序列合并,得到完全有序的子序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序列表合并成一个有序表,称为二路归并。
步骤:
1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
4. 重复步骤 3 直到某一指针达到序列尾;
5. 将另一序列剩下的所有元素直接复制到合并序列尾。
/**
* merge sort
* @param {Array} arr
* @return {Array}
*/
function mergeSort(arr) {
var len = arr.length;
if (len < 2) {
return arr;
}
var middle = Math.floor(len / 2),
left = arr.slice(0, middle),
right = arr.slice(middle);
return merge(mergeSort(left), mergeSort(right))
}
/**
* merge arr
* @param {Array} left
* @param {Array} right
* @return {Array}
*/
function merge(left, right) {
var result = [];
while (left.length && right.length) {
if (left[0] > right[0]) {
result.push(right.shift());
} else {
result.push(left.shift());
}
}
while (right.length) {
result.push(right.shift());
}
while (left.length) {
result.push(left.shift());
}
return result;
}
console.log(mergeSort([1, 3, 4, 0, 7]));