冒泡排序再理解

今天重新学习这个人人皆知的算法-----冒泡排序


冒泡排序
1、从头依次访问数组每个元素,进行相邻元素之间的交换
2、元素之间两两交换,把小的换到前面,大的放到后面。
3、所有元素交换完成后,一趟交换完成,此时最大的元素会到数组尾部。
4、反复执行以上步骤,直到所有元素都排序完。


  这个冒泡算法基本大家都学过,本人愚笨一直也没有深入理解这个算法,往往都是记住大概的代码样子,导致过了很久完全不记得冒泡排序是怎么回事。这次本着搞清楚它的目标来重新学习它,为什么是这样,而不是这样。


算法:

function bubbleSort(nums){
	//数组长度
	var n = nums.length;
	//外层控制跑的趟数
	for(var i=0;i<n-1;i++){
		//这层控制交换的次数
		for(var j=0;j<n-i-1;j++){
			//如果前面大于后面的,就交换过来,把最大的换到最后面
			if(nums[j]>nums[j+1]){
				//相邻交换
				var temp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = temp;
			}
		}
	}
	return nums;
}

冒泡原理:
 以前理解:只记得是2个数字交换,再按一定的顺序排好。
 现在理解:通过一趟又一趟的元素交换排序,达成最终的排序,也就是说一趟排序可以排好一个元素到最后,每一趟下来,需要排序的元素都会少一个。


疑惑探究:
 疑惑1:一直没有搞清楚双循环的目的,只知道要双循环。
 探究1:冒泡算法通过双循环来控制跑的趟数和每趟需要比较的元素,即外层循环控制跑的趟数,内层循环控制需要比较的元素个数。

 疑惑2:外层循环,内层循环的循环条件如何理解?
 探究2:明白了每层循环的目的之后,就能更好理解每层循环的循环条件了。外层循环既然是控制循环的趟数,一趟最坏的情况是排好一个元素,所以n个元素需要n趟,因为剩最后一个元素时,整个数组已经排序好,所以最后需要n-1趟。循环条件就是:

	for(var i=0;i<n-1;i++){}

 疑惑3:交换方式真的理解了嘛?

	if(nums[j]>nums[j+1]){
		var temp = nums[j];
		nums[j] = nums[j+1];
		nums[j+1] = temp;
	}

 探究3:以前只认为是简单2个数交换,并没有把它放在整个循环中考虑。在内层循环中跑完一趟之后,无论是换大的还是小的。按照内层循环条件来写的话,都是把最大或者最小的元素慢慢移到最后去,而不是移到最开始。之前我一直想错,以为是换到前面。

 误区3:之前我一直没有想清楚冒泡的整个过程,导致我经常习惯写出下面这样的循环,想法很好交换一趟,最开头的元素固定,自然就从第二个元素开始继续交换,实际却不知道这样交换的结果是每次尾部的元素的固定,前面许多元素没有排序好的也不会在排序,最后的结果当然也不会正确。错误代码:

	for(var i=0;i<n-1;i++){
		for(var j=i;j<n-1;j++){
			if(nums[j]<nums[j+1]){
				var temp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = temp;
			}
		}
	}

  重新理解了一遍冒泡算法,收获良多,再去温习几遍。每一次重新梳理知识点,发现自己以前认识的是错误的,就要好好学习了,不能误人子弟啊!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值