归并排序是一种执行归并操作的排序算法,该算法采用分而治之的方法。归并排序的实现由两种方案:
自上而下
自下而上
//---------------------------------------------------------------------------
// 自上而下的归并
// 分割
function margeSort(arr){
var len = arr.length;
if (len < 2) {
return arr;
}
var midValue = Math.floor(len / 2);
var leftArr = arr.slice(0, midValue);
var rightArr = arr.slice(midValue);
return merge(margeSort(leftArr), mergeSort(rightArr));
}
// 合并方法
function merge(leftArr, rightArr){
var result = [];
while(leftArr.length && rightArr.length){
if (leftArr[0] > rightArr[0]) {
result.push(rightArr.shift());
}else{
result.push(leftArr.shift());
}
}
while(leftArr.length){
result.push(leftArr.shift());
}
while(rightArr.length){
result.push(rightArr.shift());
}
return result;
}
//---------------------------------------------------------------------------
// 下而上的迭代
function mergeSort(arr){
var len = arr.length;
if (len < 2) {
return arr;
}
while(arr.length >= 1){
arr = margeGroup(arr);
}
return arr[0];
}
// 分组
function margeGroup(currentArr){
var result = [];
while(currentArr.length){
var leftArr = currentArr.shift;
var rightArr = []
if (currentArr.length) {
rightArr = currentArr.shift;
}
result.push(merge(leftArr, rightArr));
}
return result;
}
// 合并
function merge(leftArr, rightArr){
var result = [];
while(leftArr.length && rightArr.length){
if (leftArr[0] > rightArr[0]) {
result.push(rightArr.shift());
}else{
result.push(leftArr.shift());
}
}
while(leftArr.length){
result.push(leftArr.shift());
}
while(rightArr.length){
result.push(rightArr.shift());
}
return result;
}