冒泡算法-优化-鸡尾酒算法

4 篇文章 0 订阅
4 篇文章 0 订阅

 

em~冒泡的原理就不重复了,这个百度下就清楚啦。

首先写一版大家都会的冒泡排序代码:

当我们现在需要对数组int array[] = new int[]{2,3,1,323,32,233,23,122,13,4254,232,435,242,453,53};进行排序时,我们最简单的方法就是通过两层for循环遍历判断来进行排序,此时O(n^2) 

public class Bubble {

	int array[] = new int[]{2,3,1,323,32,233,23,122,13,4254,232,435,242,453,53};
	public Bubble() {
		for(int i = 0 ; i < array.length ; i++) {
			for(int j = 0 ; j < array.length - i - 1 ; j++) {
				if(array[j]>array[j+1]) {
					int temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp ;
				}
			}
		}
		
		for(int a : array) {
			System.out.print(a+",");
		}
	}
	
	public static void main(String[] args) {
		new Bubble();
	}
}

而平时我们排序的数组有可能是这样的:int array[] = new int[]{11,1,2,3,4,5,6}; 此时除了11以外的元素已经排好序了。那么对于上面的代码当i=0的时候11已经沉底,数组array[]={1,2,3,4,5,6,11}此时数组已经完成了排序。那么当i>=1的时候array[j]>array[j+1]条件将不会成立。我们可以认为当i=n,对于所有的j ,array[j]>array[j+1]都不成立,则表示数组已经排好序不需要有任何的元素移动了。此时就可以跳出判断。如下代码中O=n,就大大优化了算法的时间

public class Bubble {

	int array[] = new int[]{11,1,2,3,4,5,6};
	public Bubble() {
		for(int i = 0 ; i < array.length ; i++) {
			boolean isChange = false ;
			for(int j = 0 ; j < array.length - i - 1 ; j++) {
				if(array[j]>array[j+1]) {
					int temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp ;
					isChange = true ;
				}
			}
			if(!isChange) {
				System.out.println(i);
				break ;
			}
		}
		
		for(int a : array) {
			System.out.print(a+",");
		}
	}
	
	public static void main(String[] args) {
		new Bubble();
	}
}

然鹅也有这样一种数组int[] array = new int[]{11,12,13,14,15,1}; 前面是已经排好序的,最后一个元素是最小的。按照冒泡排序的规则,第一次排序后array={11,12,13,14,1,15} , 第二次为array={11,12,13,1,14,15} , 第三次为array={11,12,1,13,14,15},第四次为array={11,1,12,13,14,15},最后一次为array={1,11,12,13,14,15},需要遍历到最后一次才能得到结果。对于这样的情况也有一种优化方式。em,业界上管这算法叫做鸡尾酒算法,鸡尾酒算法的原理跟冒泡差不多,只不过是鸡尾酒算法第一轮从左到右冒泡,第二轮从右到左冒泡,第三轮从左到右冒泡...依次循环到n次。

代码如下:

public class Cocktail {

	
	int array[] = new int[]{11,12,13,14,1};
	public void doIt() {
		
		for(int i = 0 ; i < array.length ; i++) {
			boolean isChange = false ;
			if(i%2==0) {
				for(int j = 0 ; j < array.length -i- 1 ; j++) {
					if(array[j]> array[j+1]) {
						int temp = array[j];
						array[j] = array[j+1];
						array[j+1] = temp ;
						isChange = true ;
					}
				}
			}else {
				for(int j = array.length-i-1 ; j > 0; j--) {
					if(array[j-1]> array[j]) {
						int temp = array[j-1];
						array[j-1] = array[j];
						array[j] = temp ;
						isChange = true ;
					}
				}
			}
			if(!isChange) {
				System.out.println(i);
				break ;
			}
			
		}
		
		for(int a : array) {
			System.out.print(a+",");
		}
	}
	

	public static void main(String[] args) {
		Cocktail cocktail = new Cocktail();
		cocktail.doIt();
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麦田小猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值