基于JS实现归并排序算法

1 /***************JS归并排序****************/
 2  
 3 /*之前学习了一下归并算法,现在想把他分享给大家*/
 4 /*
 5  * 归并排序,分开数组,不断一分为二直到只剩一个元素(这里用到递归思想,不断自己分开自己), 
 6  * 然后对分开的自己进行排序,在归并的路上不断排序,从而实现最终排序
 7  * 时间复杂度O(NlogN)
 8  * 它的速度仅次于快速排序,而且很稳定
 9  * 但是空间需求一般会高点,大型的项目或者数据均为有序的时候用归并排序会多点
10  */
11 function mergeSort(arr) {               //我们先在主函数中定义分离方法,最后在结果中调用排序算法
12     if(arr.length === 1){               //定义递归终止条件,当元素均为1个时,开始归并
13         return arr ;
14     }
15 
16     let mid = Math.floor((arr.length)/2);       //Math.floor用以寻找当前给的数,如果没有则向下寻找最近的
17 
18     let left = arr.slice(0,mid);                //调用slice方法来返回数组,其不改变原数组
19     let right = arr.slice(mid);
20 
21     return rank(mergeSort(left),mergeSort(right));      //递归用在了这里
22 }
23 
24 function rank(left,right) {
25     let result = [];                                            //定义容器
26     let pl = 0,                                                 //定义两个指针
27         pr = 0;
28     
29     while(pl < left.length && pr < right.length){    //两个数组只要都同时有数,就进行循环
30         if(left[pl] < right[pr]){                    //这里的两个数组必然是都已经排序完成了,互相比较即可
31             result.push(left[pl]);
32             pl++;                                    //谁添加了数组元素,谁就移动一下自己的指针,所以这里用while不用for
33         }else{
34             result.push(right[pr]);
35             pr++;
36         }
37     }
38 
39     while(pl < left.length){                         //上面循环结束的条件是有一个数组循环结束了
40         result.push(left[pl]);                       //他们俩不可能同时有数,所以不管谁剩了,统统添加进去
41         pl++;
42     }
43     while(r < right.length){
44         result.push(right[pr]);
45         pr++;
46     }
47 
48     return result;
49 }
50 console.log(mergeSort([2,58,5,6,5,89,38]))       //[2,5,5,6,38,58,89]