归并排序算法

归并排序

//合并两个有序数组
function mergeTwoSorteds(left,right){
	let n1 = left.length, n2 = right.length;
	
	//判断数组arr1最后一个值和数组arr2的第一个
	//如果arr1[n1-1]<=arr2[0],就无需进行循环,直接合并
	if(left[n1-1] <= right[0]){
		return left.concat(right)
	}
	//同理
	if(right[n2-1] <= left[0]){
		return right.concat(left)
	}
	
	//定义一个临时数组用来存放每次合并好的有序数组
	let tmp = []
	
	// k 为 数组left的起始位置
	// j 为 数组right的起始位置
	let k = 0, j = 0
	
	//循环
	while(k < n1 && j < n2){
		if(left[k] <= right[j]){
			tmp.push(left[k])
			k++
		}else{
			tmp.push(right[j++])
		}
	}

	//检查left是否有剩下,一并拷贝进数组
	if(k<n1){
		tmp = tmp.concat(left.slice(k))
	}
	//同理
	if(j<n2){
		tmp = tmp.concat(right.slice(j))
	}

	return tmp
	
}


//拆分递归
function mergeSort (arr){
	let len = arr.length
	if(len <=1)return arr
	
	//找出数组中间下标
	let middle = Math.floor(len/2)
	let left = arr.slice(0,middle)
	let right = arr.slice(middle)
	//递归划分
	let leftSplited = mergeSort(left) 
	let rightSplited = mergeSort(right) 

	return mergeTwoSorteds( leftSplited, rightSplited )
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值