java-冒泡排序,交换两个数的三种方式

冒泡排序和交换两个数的三种方式

冒泡排序

冒泡排序
原理:比较两个相邻的元素,将值大的元素交换到右面
给一个数组 arr ,数组中的元素 int [ ] arr ={8,9,10,6,4},用冒泡排序的做法进行排序

8,9,10,6,4
第一趟: 8 和 9 进行比较,9 大所以不用交换  ,9 和 10 比较,10 大所以不用交换
10 和 6 比较 10 大交换10 和 6 的位置 
 现在数组为   8  9   6  10  4 
 继续进行比较  10 和 4 进行比较  10 大,交换 10 和 4 的位置 
 最后第一趟比完的序列为: 8  9  6  4  10
第二趟: 8 和 9 比较 不用交换位置, 9 和 6 比较,9 大 交换 9 和 6的位置,序列为 8  6 9 4 10
9 和 4 进行比较 交换 9 和 4的位置 现在序列为 8 6 4 9 10
最后第二趟比完的序列为:8 6 4 9 10
第三趟:8 和 6比较 ,8 大 交换位置,序列为 6 8 4 9 10
8 和 4比较 8大 交换位置 序列为 6 4 8 9 10
最后第三趟比完的序列:6 4 8 9 10
第四趟 : 6 和 4 比较 6 大 交换位置 序列为: 4 6 8 9 10
最后第四趟比完的序列为:4 6 8 9 10

如下图所示
在这里插入图片描述

根据上面的图可以发现,每一趟最大的数沉底,下一趟排序的时候就不用在比较
用双层循环来做
外循环 外循环表示要进行多少次比较  比较次数 length -1
内循环  内循环表示两两交换 每一趟比较都比上一趟少比一次 比较次数为 length - 1 - i
然后两两交换 
public class MaoPao {
//时间复杂度是 o(n^2)
	public static void main(String[] args) {
		int [] arr = {8,9,10,6,4};

		for(int i =0 ;i<arr.length -1;i++) {//外层循环
			for(int j=0;j<arr.length - 1 -i;j++) {//内层循环
				if(arr[j] > arr[j+1]) {//两个数交换
					int temp =arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
		for(int i =0;i<arr.length;i++) {//打印数组
			System.out.print(arr[i]+"  ");
		}	
	}
}
输出
4  6  8  9  10  

交换两个数的三种方式

用位运算交换两个数
有三种方法
① 不用第三个变量,位运算
② 用第三个变量 
③ 用两数之和减去另一个数
异或运算 ^    -->无进位相加
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
相同为0,不同为 1
性质
① 0 ^ N = N
② 满足交换律和结合律
③ ^同一批数无论什么样的顺序结果都是一样的。

	    a = a ^ b;//①
		b = a ^ b;//②
		a = a ^ b;//③
		的操作实现两个数交换的运算过程
例:
int a = 17; //甲
int b = 15;//乙
执行①操作,a = 甲 ^ 乙,b = 乙
执行②操作,b = 甲 ^ 乙 ^ 乙,两个乙 ^ 为 0,a = 甲 ^ 乙,b = 甲 ^ 0 = 甲
执行③操作,a = 甲 ^ 乙 ^ 甲,两个甲相 ^ 为 0,a =甲 ,b不变为甲,a=乙 ^ 0 =乙
交换a,b完成。

public class SwapTest {
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
	
		//不用第三个变量-用位运算
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
		System.out.println(a);
		System.out.println(b);
		//用第三个变量
		int temp = a;
			   a = b;
			   b = temp;
	    System.out.println(a);
		System.out.println(b);
		//不用第三个变量-用两个数之和减去另一个数
			   a = a + b;
			   b = a - b;
			   a = a - b;
		System.out.println(a);
		System.out.println(b);
	}
}

冒泡排序的第二种写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值