基于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]