思路:第一次循环将数组中最大的值放在数组的最后(原数组的倒数第一位置);第二次循环则将以剩下数据组成的数组再次循环,把剩下数据组成的数组中的最大值再次放到最后(原数组的倒数第二位置);以此类推,直到结束。
外层循环:控制循环次数,e大于0说明数组中还有数据;
内层循环:控制比较的数据,实现将每次循环的数组中最大值放到最后。
冒泡排序相信小伙伴们基本都被问到过,是比较简单的算法了,就直接上代码了~~
/*
* 冒泡排序
* mrz
* 2021-12-30
*
*/
public static void main(String[] args) {
//冒泡排序,按照从小到大排序
int[] arr = {2,8,1,5,9,7,4};
//循环数组,长度减一是因为最后只剩下一个数,不需要再比较大小了
//e大于0说明还没循环结束,每次循环完就自减(因为上一次循环已经把最大的数放在数组最后了)
for(int e = arr.length-1; e>0; e--) {
//第二层循环次数以第一层循环完剩下的长度,也就是每次排完序剩下的值的长度
for (int i = 0; i < e; i++) {
//从第一个值开始,比较第一个和第二个值,以此类推直到最后一个,如果第一个大于第二个就交换位置
//否则继续循环第二个和第三个,直到结束
if(arr[i]>arr[i+1]) {
//交换位置方法
swap(arr, i, i+1);
}
}
}
for(int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
/*
* 用异或方式实现在不新创建变量情况下实现位置互换
* 异或性质:数值相同,则结果为0,不同则为1
* 0 ^ N = N 0与任何一个数异或结果都为N
* N ^ N = 0 任何一个数与自己异或都是0
* 满足交换律与结合律:a ^ b = b ^ a a ^ b ^ c = a ^ (b ^ c)
*
* int a = 甲; int b = 乙;
* a=a^b; a=甲^乙;
* b=a^b; b=甲^乙^乙=甲;
* a=a^b; a=甲^乙^甲=乙;
* 由此实现两个变量值的位置互换
*/
public static void swap(int[] arr,int i,int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
需要注意的是,代码中如果arr[i]异或arr[j],i和j相同时值是0