冒泡排序及优化

版本一

只考虑算法的实现


	public static void  version1(int[] array) {
		for (int i = 0; i < array.length-1; i++) {
			for (int j = 0; j < array.length-i-1; j++) {
				if (array[j]>array[j+1]) {
					int temp=array[j+1];
					array[j+1]=array[j];
					array[j]=temp;			
				}
			}
		}
	}

版本二

如果数组的某一部分本身就是有序的,能显著减少循环的趟数

	public  static void version2(int[] array) {
		for (int i = 0; i < array.length-1; i++) {
			boolean flag=true;
			for (int j = 0; j < array.length-i-1; j++) {
				if (array[j]>array[j+1]) {
					int temp=array[j+1];
					array[j+1]=array[j];
					array[j]=temp;			
					flag=false;
				}
			}
			if (flag) break;
		}
	}

分析:我们假设在进行某趟排序时已经有序了,以boolean flag=true来标识这种假设,如果说在该趟排序判断大小时存在数值交换,即此时还不是有序的,如果有序了则不会在判断后进行数值交换,也就是不满足这种假设此时将标识flag赋值为false。 如果说在该趟循环中,每次判断大小都没有进行数值交换,那说明数组已经有序了此时不会改变flag的值  当值为true时直接跳出该趟循环。  

演示

public class BubbleSort {
	public static void main(String[] args) {
		int[] a= {1,6,5,23,7,8,9};
		int[] b= {1,6,5,23,7,8,9};
		
        version1(a);
		for (int i : a) {
			System.out.print(i+" ");
		}

		version2(b);
		for (int i : b) {
			System.out.print(i+" ");
		}
	}

结果:
第1趟循环
第1趟第1次循环
第1趟第2次循环
第1趟第3次循环
第1趟第4次循环
第1趟第5次循环
第1趟第6次循环
第2趟循环
第2趟第1次循环
第2趟第2次循环
第2趟第3次循环
第2趟第4次循环
第2趟第5次循环
第3趟循环
第3趟第1次循环
第3趟第2次循环
第3趟第3次循环
第3趟第4次循环
第4趟循环
第4趟第1次循环
第4趟第2次循环
第4趟第3次循环
第5趟循环
第5趟第1次循环
第5趟第2次循环
第6趟循环
第6趟第1次循环
1 5 6 7 8 9 23 


第1趟循环
第1趟第1次循环
第1趟第2次循环
第1趟第3次循环
第1趟第4次循环
第1趟第5次循环
第1趟第6次循环
第2趟循环
第2趟第1次循环
第2趟第2次循环
第2趟第3次循环
第2趟第4次循环
第2趟第5次循环
1 5 6 7 8 9 23 

可以看出减少了循环次数 在一定程度上得到了优化

 

某些与算法无关的代码在写博客时没有带上

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值