JAVA实现冒泡排序及简单优化

原理:每次比较两个相邻的元素,将较大的元素交换至右端。
思路:每次冒泡排序操作将相邻的两个元素进行比较,看是否满足大小关系要求,如果满足,就交换这两个相邻元素的位置,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序。
通过一个简单的图来理解冒泡排序:

假设有数{3,4,1,2} 要进行排序,我们通过图来解释第一次排序来理解过程,第二,第三,,,第N次排序方法与第一次相同。
在这里插入图片描述 首先3和4进行比较(如图第一行),发现3<4所以不发生位置改变,数为 3,4,1,2。 然后数组下标+1,用4和1进行比较(如图第二行),发现4>1,所以位置互换,数变为3,1,4,2。 然后数组下标继续+1,用4和2进行比较(如图第三行),发现4>2,所以位置互换,数变为3,1,2,4。这样第一次排序结束,我们发现就像冒泡一样 ,将最大的4先冒出去。

下面就是整个冒泡过程:
在这里插入图片描述
以上,第二第三次可以看到,其实第二次冒泡的时候,数组已经是有序的了,因此,还可以优化,即如果当次冒泡操作没有数据交换时,那么就已经达到了有序状态。

**代码示例:


import java.util.Arrays;

/**
 * 冒泡排序
 *
 */
public class MaoPao {
	public static void main(String[] args) {
		
		int[] values= {3,1,6,2,9,0,7,4,5,8};
		int temp=0; //换顺序中间变量
		//外层排序控制排序次数
		for(int i=0;i<values.length-1;i++) {
			//内层循环控制比较大小,换顺序
			for(int j=0;j<values.length-i-1;j++) {
				if(values[j]>values[j+1]) {
					temp=values[j];
					values[j]=values[j+1];
					values[j+1]=temp;
				}
				System.out.println(Arrays.toString(values));
			}
			System.out.println("************");
		}
		

	}
} 

**
内层循环为什么要n-i-1,是因为每次比较都排出了最大的一个数,我们需要把它去掉,因为它已经是最大的一个了,无需在比较,不懂的可以在纸上画一画就明白了。

上面提到,在第二次可能是第三次等等的时候我们已经排好序了,所以上面程序可以优化,上面程序结果如下:
[1, 3, 6, 2, 9, 0, 7, 4, 5, 8]
[1, 3, 6, 2, 9, 0, 7, 4, 5, 8]
[1, 3, 2, 6, 9, 0, 7, 4, 5, 8]
[1, 3, 2, 6, 9, 0, 7, 4, 5, 8]
[1, 3, 2, 6, 0, 9, 7, 4, 5, 8]
[1, 3, 2, 6, 0, 7, 9, 4, 5, 8]
[1, 3, 2, 6, 0, 7, 4, 9, 5, 8]
[1, 3, 2, 6, 0, 7, 4, 5, 9, 8]
[1, 3, 2, 6, 0, 7, 4, 5, 8, 9]
************
[1, 3, 2, 6, 0, 7, 4, 5, 8, 9]
[1, 2, 3, 6, 0, 7, 4, 5, 8, 9]
[1, 2, 3, 6, 0, 7, 4, 5, 8, 9]
[1, 2, 3, 0, 6, 7, 4, 5, 8, 9]
[1, 2, 3, 0, 6, 7, 4, 5, 8, 9]
[1, 2, 3, 0, 6, 4, 7, 5, 8, 9]
[1, 2, 3, 0, 6, 4, 5, 7, 8, 9]
[1, 2, 3, 0, 6, 4, 5, 7, 8, 9]
************
[1, 2, 3, 0, 6, 4, 5, 7, 8, 9]
[1, 2, 3, 0, 6, 4, 5, 7, 8, 9]
[1, 2, 0, 3, 6, 4, 5, 7, 8, 9]
[1, 2, 0, 3, 6, 4, 5, 7, 8, 9]
[1, 2, 0, 3, 4, 6, 5, 7, 8, 9]
[1, 2, 0, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 0, 3, 4, 5, 6, 7, 8, 9]
************
[1, 2, 0, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 0, 2, 3, 4, 5, 6, 7, 8, 9]
************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
************
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
************

在这里我们可以看出,在第五次排序以后就已经完成了排序,但程序已经没有执行结束,这样就造成了时间复杂度(程序运行的次数),所以我们可以优化程序。
优化程序如下:


/**
 * 冒泡排序
 *
 */
public class MaoPao {
	public static void main(String[] args) {
		
		int[] values= {3,1,6,2,9,0,7,4,5,8};
		 boolean flag = true; //优化判断
		int temp=0; //换顺序中间变量
		//外层排序控制排序次数
		for(int i=0;i<values.length-1;i++) {
			flag=true//内层循环控制比较大小,换顺序
			for(int j=0;j<values.length-i-1;j++) {
				if(values[j]>values[j+1]) {
					temp=values[j];
					values[j]=values[j+1];
					values[j+1]=temp;
					flag=false; //如果位置发成改变 改为false 继续交换
				}
			}
			//判断书否可以结束排序 如果上面不交换了flag九尾true
			if(flag) {
				break;
			}
			System.out.println("************");
		}
		

	}
} 
	以上就是冒泡排序及其简单优化
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值