冒泡排序(Bubble Sort)
每次比较相邻的两个数的大小。一次冒泡会找出数据中的最大值,放到数组最后。
n个数组的冒泡排序,最多需要执行n次冒泡。
我们按照从小到大的目标来进行冒泡排序。
初始数据:
[6,2,7,1,2,10,3]
第一次冒泡,10应该排在最后,即:
[2,6,7,1,2,10,3]
[2,6,1,7,2,10,3]
[2,6,1,2,7,10,3]
[2,6,1,2,7,3,10]
我们注意到最后一次输出,作为数组中最大的数10,排在了最后的位置。
其中6和2互换了位置,1和7,2和7也换了位置,这些就是上面提到的逻辑:每次比较相连的两个数,前数大于后数则交换(目标是最终是按照从小到大排列)。
代码:
public static void sort(int[] arrs) {
System.out.println("排序前的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
System.out.println();
//只控制循环的次数,有几个数就循环几次
for(int i=0; i<arrs.length; i++) {
//比较交换,第一次循环,比较n-1次,第二次循环,比较n-2次
//j<arrs.length-i-1,这里减i是将已经排序的数排除掉,减1是因为每次循环中需要比较的次数是n-1,比如5个数,你只需要比较4次
for(int j=0; j<arrs.length-i-1;j++) {
if(arrs[j]>arrs[j+1]) {
int temp = arrs[j];
arrs[j] = arrs[j+1];
arrs[j+1] = temp;
}
}
System.out.println("第"+i+1+"次冒泡:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
System.out.println();
}
System.out.println("排序后的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
}
输出:
排序前的数组:
6 2 7 1 2 10 3
第1次冒泡:
2 6 1 2 7 3 10
第2次冒泡:
2 1 2 6 3 7 10
第3次冒泡:
1 2 2 3 6 7 10
第4次冒泡:
1 2 2 3 6 7 10
第5次冒泡:
1 2 2 3 6 7 10
第6次冒泡:
1 2 2 3 6 7 10
第7次冒泡:
1 2 2 3 6 7 10
排序后的数组:
1 2 2 3 6 7 10
Process finished with exit code 0
如果数组在排序过程中已经是有序的了(最终排序结果),则不需要再进行后续的冒泡了,则直接退出,代码如下:
public static void sort2(int[] arrs) {
System.out.println("排序前的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
System.out.println();
//只控制循环的次数,有几个数就循环几次
for(int i=0; i<arrs.length; i++) {
boolean flag = false;
//比较交换,第一次循环,比较n-1次,第二次循环,比较n-2次
//j<arrs.length-i-1,这里减i是将已经排序的数排除掉,减1是因为每次循环中需要比较的次数是n-1,比如5个数,你只需要比较4次
for(int j=0; j<arrs.length-i-1;j++) {
if(arrs[j]>arrs[j+1]) {
int temp = arrs[j];
arrs[j] = arrs[j+1];
arrs[j+1] = temp;
flag = true;
}
}
if(!flag) {
System.out.println("排序后的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
return;
}
}
System.out.println("排序后的数组:");
Arrays.stream(arrs).forEach(x->System.out.print(x + " "));
}