js冒泡排序和快速排序

复习一下js的冒泡排序和快速排序,以及犯的错误;

  1. 冒泡排序:两层for循环进行遍历;逐个比较,大的放右边。
在这里插入代码片//冒泡排序
let arr = [];
for(let i = 0; i < 300; i++){
	arr[i] = Math.floor(Math.random()*300 + 1);
}
function sort2(array){
	for(let i = 0; i < array.length; i++){
		for(let j = 1+i ; j< array.length; j++){
			if(array[i] > array[j]){
				exchange(array,i,j);
			}
		} 
	}
	//console.log(array);
}

用于交换素组内容的方法:

function exchange(arrr,x,y){
	arrr[x] = arrr[x]+arrr[y];
	arrr[y] = arrr[x]-arrr[y];
	arrr[x] = arrr[x]-arrr[y];
}

为了将两种排序的快慢进行比较,我们需要获取执行前的时间和执行后的时间。(单位ms)。

let time1 = new Date().getTime();
sort2(arr);
let time2 = new Date().getTime();
console.log(time2 - time1);

  1. 快速排序:取参考值(我是以数组的第一项作为参考的),然后对整个数组进行遍历,与参考值进行比较。(新建两个空数组 L ,R)比他大的或者等于他的放右边,比他小的放左边,递归地对左右数组进行相同处理,左右数组返回后使用array.concat()进行拼接。问题出现的地方,如果不把参考项挖出来,就会出现下面这种情况:

[5,2,8,9,6,3,4]
[2,3,4] — [5,8,9,6]
[ ]–[2,3,4] —[ ]–[5,8,9,6]
发现了吗,右边的数组将不会减少,最后我们使用递归的时候就会直接栈溢出。所以我们要用splice方法把原数组挖出参考项。

这是错误代码:

function sort1(arry){
	if(arry.length <= 1){
		return arry;
	}
	let x1 = arry[0];
	let L = [], R = [];
	for( let i = 0 ; i < arry.length; i++){
		if(arry[i] < x1){
			L.push(arry[i]);
		}
		else{
			R.push(arry[i]);
		}
	}
	return sort1(L).concat(x1,sort1(R));
}

加一句splice后就正确了:

function sort1(arry){
	if(arry.length <= 1){//如果数组只剩一项就不用排序了。
		return arry;
	}
	let x1 = arry.splice(0,1);//把取出的参考值赋给x1,原数组将少一项。
	//console.log(x1);
	let L = [], R = [];
	for( let i = 0 ; i < arry.length; i++){
		if(arry[i] < x1){
			L.push(arry[i]);
		}
		else{
			R.push(arry[i]);
		}
	}
	//console.log(L , R);
	return sort1(L).concat(x1,sort1(R));
}

本人2020年毕业萌新一枚,第一次发文,有不足的地方希望各位大佬多多指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值