冒泡排序_详解

冒泡排序 详解

原理

首先 我们有一个无序的数组 例如:

int[] num = {5,6,8,4,1,7};

我们把第一次要把最大的数排到整个数组的最后面 得到如下数组

num = {5,6,4,1,7,8};

具体实现原理就是 如果前面一个数比后面的大就交换两个数的位置

5 和 6 比较 5小 位置不变 5,6,8,4,1,7

再 6 和 8 比较 6小 位置不变 5,6,8,4,1,7

再 8 和 4 比较 8大 交换4和8的位置 5,6,4,8,1,7

再 8 和 1 比较 8大 交换1和8的位置 5,6,4,1,8,7

再 8 和 7 比较 8大 交换7和8的位置 5,6,4,1,7,8

我们 再将经过上面步骤处理后的数组 {5,6,4,1,7,8 } 再次执行上面的步骤

5 和 6 比较 5小 位置不变 5,6,4,1,7,8

再6 和 4 比较 4小 交换4和6的位置 5,4,6,1,7,8

再6 和 1 比较 1小 交换1和6的位置 5,4,1,6,7,8

再6 和 7 比较 6小 位置不变 5,4,1,6,7,8

再7 和 8 比较 7小 位置不变 5,4,1,6,7,8

我们 再将经过上面步骤处理后的数组 { 5,4,1,6,7,8 } 再次执行上面的步骤

5 和 4 比较 4小 交换5和4的位置 4,5,1,6,7,8

再5 和 1 比较 1小 交换1和5的位置 4,1,5,6,7,8

再5 和 6 比较 5小 位置不变 4,1,5,6,7,8

再6 和 7 比较 6小 位置不变 4,1,5,6,7,8

再7 和 8 比较 7小 位置不变 4,1,5,6,7,8

我们 再将经过上面步骤处理后的数组 {4,1,5,6,7,8 } 再次执行上面的步骤

4 和 1 比较 1小 交换4和1的位置 1,4,5,6,7,8

再4和 5 比较 4小 位置不变 1,4,5,6,7,8

再5 和 6 比较 5小 位置不变 1,4,5,6,7,8

再6 和 7 比较 6小 位置不变 1,4,5,6,7,8

再7 和 8 比较 7小 位置不变 1,4,5,6,7,8

这样我们就完成了排序

实现代码:

class BubbleSort{
	/*
		冒泡排序
	*/
	public static void main(String[] args){
		int[] num = {5,6,8,4,1,7};
		for(int j=0;j<num.length-1;j++){
			/*
			内层寻环第一次实现将最大的数放在最后一位
					第二次实现将第二大的数放在倒数第二位
					以此类推
			*/ 
			for (int i=0;i<num.length-1;i++ ){
				if(num[i]>num[i+1]){
					/*交换两数的值
					其实和
					int temp = num[i];
					num[i] = num[i+1];
					num[i+1] = temp;
					效果一样
					*/ 
					num[i] = num[i+1]^num[i];
					num[i+1] = num[i+1]^num[i];
					num[i] = num[i+1]^num[i];
				}
			}
		}
		
		for (int a : num ){
			System.out.println(a);
		}
		
	}
}

代码优化

通过原理部分的分析我们可以看到 第一次 我们要比较6次

第二次的时候最后一位已经确定 所以就只用比较5次

以此类推

所以我们对代码进行如下优化:

class BubbleSort{
	/*
		冒泡排序
	*/
	public static void main(String[] args){
		int[] num = {5,6,8,4,1,7};
		for(int j=0;j<num.length-1;j++){
			/*
			内层寻环第一次实现将最大的数放在最后一位
					第二次实现将第二大的数放在倒数第二位
					以此类推
			*/ 
            
            //  对内层循环的次数进行控制  让他比较的次数随外层次数的增加而减少
			for (int i=0;i<num.length-1-j;i++ ){
				if(num[i]>num[i+1]){
					/*交换两数的值
					 其实和
					int temp = num[i];
					num[i] = num[i+1];
					num[i+1] = temp;
					效果一样
					*/ 
					num[i] = num[i+1]^num[i];
					num[i+1] = num[i+1]^num[i];
					num[i] = num[i+1]^num[i];
				}
			}
		}
		
		for (int a : num ){
			System.out.println(a);
		}
		
	}
}

代码优化后 可以减少代码执行时间 提高代码运行效率

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值