Javascript实现归并排序

归并排序

将一个数组二等分, 比如原数组为[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);


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值