冒泡排序再理解

算法学习 专栏收录该内容
3 篇文章 0 订阅

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


冒泡排序
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;
			}
		}
	}

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

  • 6
    点赞
  • 1
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值