05 冒泡排序

1.冒泡排序

  1. 冒泡排序只是众多排序算法的一种,用于拓展思维,接近底层
  2. 其他排序法拓展,二分查找,快速排序,全排序,归并排序等等
  3. 冒泡排序思路
    • 多轮比较,有n个数就需要比较n-1轮;
    • 每一轮要进行多次相邻位置比较,如果不符合顺序,位置交换.第i轮就要比较n-i次
    • 前一轮排序的最大值不需要参与排序
    • 使用for循环实现冒泡排序
    • 外层循环代表轮数 n-i轮
    • 内层循环代表每轮的比较的次数 i轮就是length-i次
  4. 优化思路
    之前轮的最大值,本轮不参与比较
    若数组顺序不是特别混乱,我们可能不需要进行n-1轮比较,这个时候可以提前结束数组的比较(信号灯思想).
    在外层循环设置一个boolean变量flag,初始值为false;内层循环中一旦数据发生交换,flag的值改变为true;每次完成一轮比较(内城层循环执行完),查看flag的值是否改变为true;改变为true,标明数据位置发生了改变,则排序未完成,继续执行排序,若flag的值没有发生改变,还是false,则该轮没有发生数据改变,此时数据排序已经完成,可以利用break跳出外层循环结束程序.
    例:
private static void bubble(int[] a) {//冒泡排序
		/** 外层控制轮数,若有n个数,则需要n-1轮
		 * 从第1轮开始,最大轮数就是数组个数减1*/
		
		for(int i = 1; i <= a.length-1;i++) {//i是轮数,a.length数的个数
			/** 内层控制一轮比较的次数,第1轮比较n-1次,第i轮就是n-i次
			 * j代表数组的下标,通过下标操作数组的元素,相邻元素比较
			 * 从0开始,最大下标结束,(每一轮的最大下标为a.length -i)
			 * 注意:上一轮的最大值不参与比较,所以,i轮前进行了i-1轮比较,
			 * 		所以i轮最大下标为a.length -i(a.length-1-(i-1))*/
			boolean flag = false;
			for(int j = 1; j <= a.length - i; j++) {
				if(a[j-1] > a[j]) {
					//两个数交换位置
					int temp = a[j-1];
					a[j-1] = a[j];
					a[j] = temp;
					flag = true;
				}
			}
			if(flag = false) {//如果经历了内层循环的所有比较,flag还是初始值,
				//所以所有数据已经排序成功
				break;
			}
		}
		System.out.println(Arrays.toString(a));
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麻辣麻虾

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值