JavaScript实现归并排序
Posted 十九万里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript实现归并排序相关的知识,希望对你有一定的参考价值。
归并排序思想:
利用归并的思想实现排序,采用经典的分治策略,递归将数组两两分开知道包含一个元素,然后将数组排序合并,最终合并为排序好的数组。
// 归并排序
function mergeSort(array){
let length = array.length;
// 如果不是数组或者数组长度小于或者等于0 的,不需要返回
if(!Array.isArray(ARRAY) || length == 0)return;
if(length === 1){
return array;
}
let mid = parseInt(length >> 1), //找到中间索引值
left = array.slice(0,mid);//截取左半截
right = array.slice(mid,length);//截取右部分
return merge(mergeSort(left),mergeSort(right)); //递归分解后 选择排序合并
};
function merge(leftArray, rightArray) {
let result = [],
leftLength = leftArray.length,
rightLength = rightArray.length,
il = 0,
ir = 0;
// 左右两个数组的元素依次比较 将较小的元素怒加入到结果数组中,直到其中一共数组的元素全部加入完为止则停止
while(il < leftLength && ir < rightArray){
if(leftArray[il] < rightArray[il]){
result.push (leftArray[il+++]);
}else{
result.push(rightArray[ir++])
}
}
// 如果是左边的数组还有剩余的时候 则把剩余的元素全部加入到数组中。
while (il < leftLength){
result.push(leftArray[il++]);
}
// 如果是右边数组还有剩余 则把剩余元素全部加入到结果数组中。
while(ir < rightLength ){
result.push(rightArray[ir++]);
}
return result;
}
图解:
在网上找到一个图:
看了这个图就比较好理解了,可以看到完全的二叉树,分的阶段是一个递归拆分子序列的过程,每次对数列进行拆分。
归并排序是稳定的排序,也是一种十分高效的排序,能够利用完全二叉树特性一般性能都不会太差,
将整个排序序列看成一个二叉树分解,首先将树分解到每一个子节点,树的每一层都是一个归并排序的过程,每一层归并的时间复杂度为O(n),因为整个树的高度为lgn 所以归并排序的时间复杂度不管在什么情况下都是O(nlogn)
归并排序的平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(nlogn) ,空间复杂度为 O(n) ,是稳定排序。
以上是关于JavaScript实现归并排序的主要内容,如果未能解决你的问题,请参考以下文章