欢迎来到我的小小世界

Change is a million times less painful than regret

0%

LeetCode冒泡排序

就是传统的冒泡冒泡排序,注释中写的还是比较清楚的的,可以直接读,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Solution {
public static void swag(int[] arr,int i,int j) {//交换两个数,使用第三方变量的情况
int tmp;
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
public static void swag_nonum(int[] arr,int i,int j) {
//交换两个数,不使用第三方变量进行转换,利用加减来进行数值的交换

arr[i]+=arr[j];
arr[j]=arr[i]-arr[j];
arr[i]=arr[i]-arr[j];
}
public static void swag_binary(int[] arr,int i,int j) {
//交换两个数,不使用第三方变量进行转换,利用异或操作的交换

arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];

}
public static void BubbleSort(int[] arr) {
boolean swapped=true;// 初始时 swapped 为 true,否则排序过程无法启动
for(int i=0;i<arr.length-1;i++) {//-1是为了防止越界
if(!swapped) break;
// 设置 swapped 为 false,如果发生交换,则将其置为 true
swapped=false;
for(int j=0;j<arr.length-1-i;j++) {//减去i是因为每次都会排好一个,不用每次都遍历到最后一个,最后的一个已经是最大的了
if(arr[j]>arr[j+1]) {//比较相邻的两个数的大小,小心数组越界的情况
// 如果左边的数大于右边的数,则交换,保证右边的数字最大
swag(arr,j,j+1);
swapped=true; // 表示发生了交换
}

}
}

}

public static void main(String[] args) {

int arr[]= {9,8,6,4,1,5,9,36,54,7,0,2,5,-1,78};
BubbleSort(arr);
for (int i : arr) {
System.out.print(i+",");
}

}


}

这里在两个数据交换上用了三种方法,一种是用传统的方法,引入第三方变量作为临时存储的介质;另一种采用加法的性质,现将两数(a,b)之和赋值给a,然后用a减去b字得到a的原值并赋值给b,此时再用a-b获得b原来的值并赋值给a,完成两个数之间的交换;最后一种是评论区大神给的异或计算(注意是异或不是加法)进行交换的方法,为了防止第二种情况大数加减时出现的溢出问题。

每日一图

-------- 本文结束 感谢阅读 --------