关于冒泡排序

思想:前一项与后一项比较,如果前一项大于后一项,两者交换位置

如有数组ary[4,3,5,2,1]

第一轮:

4>3 —>交换 [3,4,5,2,1]
4<5 —>不交换 [3,4,5,2,1]
5>2 —>交换 [3,4,2,5,1]
5>1 —>交换 [3,4,2,1,5]
第一轮比较完后结果将最大的数放在最后一位,且比较次数为4

第二轮

3<4 —>不交换 [3,4,2,1,5]
4>2 —>交换 [3,2,4,1,5]
4>1 —>交换 [3,2,1,4,5]
第二轮比较完后结果将第二大的数放在倒数第二位,且比较次数为3

第三轮

3>2 —>交换 [2,3,1,4,5]
3>1 —>交换 [2,1,3,4,5]
第三轮将第三大的数放在倒数第三位,比较次数为2

第四轮

2>1 —>交换[1,2,3,4,5]
每一轮比较完,将最大的那个数放在后面,上述数组有5项,只需比较4轮
由此知最多需要比较轮数为arr.length-1

每一轮比较次数

i代表轮数 i=0 i<length-1
->j每一轮比较的次数
i=0 第一轮 4 ary.length-1-0 不用和自己比
i=1 第二轮 3 ary.length-1-1 不用和自己比前面重复比较过一次(前一轮最大的数放在最后)
i=2 第三轮 2 ary.length-1-2 不用和自己比前面重复比过两次(前两轮最大的两个数放在最后)
i=3 第四轮 1

每一轮比较次数:ary.length-1-i

代码实现

static void bubbleSort(int[]arr){
	int temp;
	for(int i=0;i<arr.length-1;i++){//比较轮数
		for(int j=0;j<arr.length-i-1;j++){//每轮比较次数
		if(arr[j]>arr[j+1])//前一项大于后一项{
			temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;//交换顺序
	}
}
}
}

冒泡排序优化

由于排序过程中可能会出现在其中某一轮已经排序好了,但是数组还是会继续排序,此时
会进行不必要的操作

解决方法:

对于数组ary[4,3,5,2,1],在每一轮比较前设置一个变量flag=false
第一轮:
4>3 —>交换 [3,4,5,2,1]
4<5 —>不交换 [3,4,5,2,1]
5>2 —>交换 [3,4,2,5,1]
5>1 —>交换 [3,4,2,1,5]
只要有交换的地方flag=true

第二轮开始前令flag=false
第二轮
…重复上述操作

优化后的代码

static void bubbleSort(int[]arr){
	int temp;
	boolean flag=false
	for(int i=0;i<arr.length-1;i++){//比较轮数
		for(int j=0;j<arr.length-i-1;j++){//每轮比较次数
		if(arr[j]>arr[j+1])//前一项大于后一项{
			temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;//交换顺序
			flag=true;//有交换flag=true
	}
	if(flag){
	flag=false;//上一轮有交换,下一轮开始前将flag设置为false
	}
	else{
	break;//上一轮没有交换,说明排序已经完成结束循环
	}
}
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹏之翼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值