归并排序算法简单来说就是利用分治的策略来解决排序问题。
(1)假设待排序数组的长度为n。首先将数组分成两个长度为n/2的数组
(2)重复步骤1,直至拆分后的数组长度为1,可以认为原数组最终拆分成了n个有序的长度为1的数组(以上可以理解为从上往下生成一个二叉树的过程)
(3)从下往上,分别将二叉树节点的两个子元素数组进行两两合并,最终得到一个有序的长度为n的数组
归并排序的时间复杂度:O(nlogn),是一种效率比较高的排序算法。
实现代码:
//分
function mergeSort(arr){
if(arr.length==1){return arr;}
var mid=Math.floor(arr.length/2); //将数组平分成两个数组
var arr1=arr.slice(0,mid);
var arr2=arr.slice(mid);
if(arr.length>1){
return merge(mergeSort(arr1),mergeSort(arr2)); //关键
}
}
//合
function merge(leftArr,rightArr){ //合并两个有序数组为一个有序数组
var ind1=0;
var ind2=0;
var newArr=[];
while(ind1<leftArr.length && ind2<rightArr.length){
if(leftArr[ind1]<=rightArr[ind2]){
newArr.push(leftArr.slice(ind1,ind1+1)[0]);
ind1++;
}else{
newArr.push(rightArr.slice(ind2,ind2+1)[0]);
ind2++;
}
}
while(ind1<leftArr.length){
newArr.push(leftArr.slice(ind1,ind1+1)[0]);
ind1++;
}
while(ind2<rightArr.length){
newArr.push(rightArr.slice(ind2,ind2+1)[0]);
ind2++;
}
return newArr;
}
结果测试: