javascript冒泡排序最详细解读

冒泡排序是什么机制

有这么一组数据,要进行从小到大的冒泡排序。

var arr = [23,79,40,19,57];

冒泡排序图片解读
根据冒泡排序的机制,让相邻的两个数进行两两比较,如果第一个数大于第二个数,则两个数交换位置。

第一轮比较
  • 让23和79进行比较,23不大于79,位置不变
    冒泡排序图片详解
  • 79和40进行比较,79>40,两个数交换位置
    冒泡排序图片详解
  • 79和19进行比较,79>19,两个数交换位置
    冒泡排序图片详解
  • 79和57比较,79>57,两个数交换位置
    冒泡排序图片详解
第二轮比较(节省篇幅:图解只展示最终结果)
  • 23和40比较,23不大于40,位置不变
  • 40和19比较,40>19,两个数交换位置
  • 40和57比较,40不大于57,位置不变
    冒泡排序图片详解
第三轮比较
  • 23和19比较,23>19,两个数交换位置
  • 23和40比较,23不大于40,位置不变
    冒泡排序图片详解
第四轮比较
  • 19和23比较,19不大于23,位置不变。
    在这里插入图片描述
    注:第五轮不再需要比较

规律

综上所述,可以抽离出一些规律,用来整理代码逻辑。

  • 数组长度为5
  • 进行了4轮比较
    冒泡排序图片详解
  • 每轮分别进行了4,3,2,1次两两比较
    • 第一轮进行了4次比较
      冒泡排序图片详解
  • 第二轮进行了三次比较
    冒泡排序图片详解
  • 第三轮进行了两次比较
    冒泡图片详解
  • 第四轮进行了一次比较
    冒泡排序图片详解

实现思路

根据上述总结规律,可以使用双层for循环来分别控制四轮循环和每轮循环里比较次数。

循环
  • 外层循环
    • 假设使用外层for循环来控制循环轮数,可以这样写:
      for(var i=1;i<arr.length;i++){
      	console.log(i) // output:1,2,3,4
      }
      
    • 也可以这样写:
      for(var i=0;arr.length-1;i++){
      	console.log(i) // output:0,1,2,3
      }
      

如此一来就可以做到数组长度为5时,循环4轮。

  • 内层循环
    • 内层循环要做到4,3,2,1,就要找到j跟arr.length的联系,这样才可以做到不管多长的数组,都能自动排序。
    • arr.length为5时,就可以根据arr.length-i,获得对应的j;
      • 本例中,arr.length固定为5;
      • i为1时,arr.length-i=4;
      • i为2时,arr.length-i=3;
      • i为3时,arr.length-i=2;
      • i为4时,arr.length-i=1;
    • 可以这样写:
      for(var j=0;j<arr.length-i;j++){
      	console.log(j) // output:0,1,2,3//0,1,2//0,1//0
      }
      
交换变量

循环问题解决之后,交换变量的事情,就可以当作循环体写进循环内即可。

思路就是让arr[j]和arr[j+1]进行比较,如果arr[j]>arr[j+1],则让两个变量交换位置。

需要注意的是,交换变量,需要一个temp中间变量来进行中转。

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

实现总结

var arr = [23,79,40,19,57];
for (var i = 1; i < arr.length; i++) {
	for (var j = 0; j < arr.length-i; j++) {
		var temp = "";
		if (arr[j] > arr[j+1]) {
			temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = temp;
		}
	}
}
console.log(arr) // output: [ 19, 23, 40, 57, 79 ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知猪狭

恰饭恰饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值