js 关于js冒泡排序的理解

冒泡排序虽然已经学完了,但是再次去写的时候,总是写不出来,而且每次写的时候需求研究很久很久,对于 i < arr.length的理解也有问题,单独拿出时间来仔细研究一下.

我们把这个流程分成几步来做,能稍微简单的去理解他,实在记不住的…就死记吧…是固定的一个东西.

我们用函数实现一个数组从小到大的排序:[5,178,3,8,12,56,157]

第一步:我们首先实现的是把这个数组最大数放到数组的最后面

看代码:

<script>
function sort(arr) { //函数的名称为sort 形参是arr,arr就是调用时实参传递来的.
	//首先来个循环把最大的数字排到最后面
	for (var i = 0;i < arr.length - 1 ; i++) { //因为数组的下标是从0开始的,而数组长度是从1开始的,所以我们要给长度减1,去跟数组的下标对应起来.比如:数组长度是7,但是这个数组的下标最大是6,没有7.所以减去1对应上.
		if (arr[i] > arr [i+1]) {  //判断条件:如果数组arr的第i个元素比arr第二个元素i+1大.在这里i是0,所以就是:如果arr的第0个元素比arr第1个元素i+1大. 理解起来就是:0跟1比,符合条件就进去执行交换位置,1再跟2比,2再跟3比,3再跟4比...以此类推,交换位置后就跟下一个数比较.
			//开始根据上面的判断条件进行位置的交换.
			var temp = arr[i];
			arr[i] = arr[i+1];
			arr[i+1] = temp;
			//交换位置的原理,是这样的:定义一个空的变量temp,交换位置时,把第0个元素放到temp,第1个元素放到0的位置,再把temp的元素放到第1个位置. 这样就实现了数值位置的变换
		}
	}
	return arr;//函数返回值
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: 5, 3, 8, 12, 56, 157, 178,最大的数值已经排到了数组的最后面.
</script>

因为上面的代码是只实现了数组里面的一个数的排序,我们循环length -1次,这里为什么是循环length -1次,因为最后一次是不需要循环的,前面的数字都排好以后,最后一次就是已经排好的.这里你也可以不减1,结果也是正确的,不知道为什么,估摸着可能是对性能有影响吧.
那我们最后就可以这样理解:
第一次循环的时候,内部循环把第一大的值放到了后面. 157
第二次循环的时候,内部循环把第二大的值放到了后面. 78
第三次循环的时候,内部循环把第三大的值放到了后面. 56
第四次循环的时候,内部循环把第四大的值放到了后面. 12
第五次循环的时候,内部循环把第五大的值放到了后面. 8
第六次循环的时候,内部循环把第六大的值放到了后面. 5
外面的循环每次循环都会把内部循环排好数输出来.

代码:

<script>
function sort(arr) {
	for (var j = 0;j<arr.length - 1;j++) { //把内部循环排序好的数字,循环出来.
		for (var i = 0;i < arr.length - 1 ; i++) {
			if (arr[i] > arr [i+1]) {
				var temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}
	}
	return arr;
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: [3, 5, 8, 12, 56, 78, 157]
</script>

这里有一个优化的地方:内部循环第一个循环,157已经排好了,第二次不需要循环了,内部第二次循环时,78已经排好了,也就是说,他其实每次循环只需要循环没有排好的数字就可以了,所以我们可以arr.length - j - 1就可以每次只循环没有排好的数字.
总起来就是:让外部循环每次循环就让内部循环减去不需要循环的次数.

<script>
function sort(arr) {
	for (var j = 0;j<arr.length - 1;j++) { //把内部循环排序好的数字,循环出来.
		for (var i = 0;i < arr.length - 1 - j ; i++) {
			if (arr[i] > arr [i+1]) {
				var temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}
	}
	return arr;
}
console.log(sort([5,178,3,8,12,56,157]));//输出一下. 结果是: [3, 5, 8, 12, 56, 78, 157]
</script>

这就是整个冒泡循环的代码,可能有错误的地方,大家参考一下就好.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值