归并排序
将一个数组二等分, 比如原数组为[9,2,6,4,8,10,1,3];
分成 [9,2,6,4] [8,10,1,3]
如果数组长度大于2 继续往下分
[9,2] [6,4];
长度小于2的话 就对无法再分的数组进行排序
[2,9] [4,6]
排序好后 进行归并 ,就是将两个数组按顺序凑到一个新数组里
这时候申请一个新数组,长度为两个数组的和 即长度为4的数组 arr = [ ?,? ,? ,? ]
将这四个数 进行比较 放入新数组里
arr1 = [2,9] arr2 = [4,6];
L1为 arr1的 数组下标计数 L2为 arr2的数组下标计数 初始都为0
进行比较 如果 arr1[L1]> arr2[L2] 2>4 不成立就把 arr1[L1]放入 arr中 然后 L1加1
然后再进行比较 arr1[L1]>arr2[L2] 9>4 成立 就把 arr2[L2]放入 arr中 L2加一
也就是将他们之中 最小的那个放入新数组中,然后下标加一,再进行比较,一直到新数组被填满 返回新数组
下面是代码
var shuzu = new Array(9,6,20,4,2,99,44,325);
var guibing = function(arr){
//分割数组 如果该数组长度大于2 继续分割 否则返回一个排序好的长度为 1或2的数组
var divide = function(arr,length){
var mid = Math.round((length)/2);
if(length>2){
var arr1 = arr.splice(0,mid);
return merge(divide(arr1,arr1.length),divide(arr,arr.length));
}else{
return sortArr(arr,length);
}
}
//归并排序 arr1,arr2是两个已排序好的数组 对两个数组进行排序
var merge = function (arr1,arr2){
console.log('归并的两个数组:',arr1,arr2);
var arr0 = new Array(arr1.length+arr2.length);
var L1 = 0;//数组1的计数器
var L2 = 0;//数组2的计数器
for(var i = 0,L1=0,L2=0;i<arr0.length;i++){
if(L1==arr1.length){
arr0[i] = arr2[L2];
L2++;
continue;
}
if(L2==arr2.length){
arr0[i] = arr1[L1];
L1++;
continue;
}
if(arr1[L1]<arr2[L2]){
arr0[i] = arr1[L1];
L1++;
}else{
arr0[i] = arr2[L2];
L2++;
}
}
console.log('归并结果',arr0);
return arr0;
}
//把长度为1 或 2 的数组排序好
var sortArr = function(arr,length){
if(length!=1&&arr[0]>arr[1]){
var temp = arr[1];
arr[1] = arr[0];
arr[0] = temp;
}
console.log('排序好的数组:',arr);
return arr;
}
return divide(arr,arr.length);
}
var result1 = guibing(shuzu);
console.log(result1);