并归排序,就是分而治之,将长的数组分解为短的数组,一直分到最后,单个单个数组,我们就认为,只有一个元素的数组是有序的。然后再逐个的合并
1、拆分: 很容易
例如数组 [ 2,4,3,5,1,6,8,7 ];
先拆为 [2,4,3,5] [1,6,8,7]
再拆 [2,4] [3,5] [1,6] [8,7]
再拆 [2] [4] [3] [5] [1] [6] [8] [7]
最后,拆分的结果,每个子数组都是有序的
2、合并,具体怎么合并,可以先来考虑一下两个有序数组的合并
var arrA = [1,3,6,8,20,40]; var arrB = [2,5,9,10,15,26,30,50,100]; //将任意两个有序的数组,合并为一个有序数组 var i = 0,j=0,arrC = []; while(i < arrA.length && j < arrB.length){ if(arrA[i] < arrB[j]){ arrC.push(arrA[i]); i++; }else{ arrC.push(arrB[j]); j++; } } while(i < arrA.length){ arrC.push(arrA[i]); i++; } while(j < arrB.length){ arrC.push(arrB[j]); j++; } console.log(arrC);
那么,我对于一个数组分段的时候,可以用 low mid high,分别表示,分段的起始点,中间点,结束点 ,,这三个点,可以得到两个有序数组,进行合并
采用递归拆分,拆分为单个元素之后,合并
//对数组 arr,从 low-mid 和 mid-high 有序合并 //相当于 arrA = arr[low:mid]; arrB = arr[mid:high] function merge(arr,low,mid,high){ var list = []; var i = low, j = mid+1; while(i <= mid && j <= high){ if(arr[i] <= arr[j]){ list.push(arr[i++]); }else{ list.push(arr[j++]); } } while( i <= mid){ list.push(arr[i++]); } while(j <= high){ list.push(arr[j++]); } var k = 0; for(i = low; i <= high; i++){ //将排序好的list,赋值给arr arr[i] = list[k++]; } } var mergeSort = function(arr,low,high){ //递归拆分 if(low < high){ var mid = Math.floor((low + high)/2); mergeSort(arr,low,mid); mergeSort(arr,mid+1,high); merge(arr,low,mid,high); //合并 } } var list = [5,3,6,4,8,7,10,9,2]; mergeSort(list,0,list.length-1); console.log(list);