算法详解:
归并排序的思想是把一个数组分成两半,排序每一半。然后用merge方法将数组的两半归并成一个有序的数组。被分的每一半使用递归,再次划分排序,直到得到的子数组只含有一个数据项为止。归并排序需要额外的一个和AB两个数组总和相等的空间,如果初始数组几乎沾满了整个存储器,那么归并排序就不能工作了。
代码:
<script type="text/javascript">
var _lok = 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 _ing = guibing(_lok);
console.log(_ing);
</script>
这是我所学到的,所以我要分享给你们,希望可以帮助到你们。
以上就是我的分享,新手上道,请多多指教(大神勿喷)。