/*********************************************
JS归并排序***************************************************/   /*之前学习了一下归并算法,现在想把他分享给大家*/

/*  * 归并排序,分开数组,不断一分为二直到只剩一个元素(这里用到递归思想,不断自己分开自己),   * 然后对分开的自己进行排序,在归并的路上不断排序,从而实现最终排序  * 时间复杂度O(NlogN)  * 它的速度仅次于快速排序,而且很稳定  * 但是空间需求一般会高点,大型的项目或者数据均为有序的时候用归并排序会多点  */ function mergeSort(arr) {               //我们先在主函数中定义分离方法,最后在结果中调用排序算法     if(arr.length === 1){               //定义递归终止条件,当元素均为1个时,开始归并         return arr ;     }

    let mid = Math.floor((arr.length)/2);       //Math.floor用以寻找当前给的数,如果没有则向下寻找最近的

    let left = arr.slice(0,mid);                //调用slice方法来返回数组,其不改变原数组     let right = arr.slice(mid);

    return rank(mergeSort(left),mergeSort(right));      //递归用在了这里 }

function rank(left,right) {     let result = [];                                            //定义容器     let pl = 0,                                                 //定义两个指针         pr = 0;          while(pl < left.length && pr < right.length){    //两个数组只要都同时有数,就进行循环         if(left[pl] < right[pr]){                    //这里的两个数组必然是都已经排序完成了,互相比较即可             result.push(left[pl]);             pl++;                                    //谁添加了数组元素,谁就移动一下自己的指针,所以这里用while不用for         }else{             result.push(right[pr]);             pr++;         }     }

    while(pl < left.length){                         //上面循环结束的条件是有一个数组循环结束了         result.push(left[pl]);                       //他们俩不可能同时有数,所以不管谁剩了,统统添加进去         pl++;     }     while(r < right.length){         result.push(right[pr]);         pr++;     }

    return result; } console.log(mergeSort([2,58,5,6,5,89,38]))