冒泡排序及其优化 JAVA版本
冒泡排序
import java.util.Arrays;
import java.util.Scanner;
/*
*测试冒泡排序及其优化
*@author Ravanla
*/
public class TestBubbleSort {
public static void main(String[] args) {
/*importance
* 外层循环 0到n-1 设为i
* 内层循环 0到n-1-i 设为j
* 假设n为5
* 外层i会经过 0 1 2 3 4
* i = 0 i = 1 i = 2 i=3 i=4
* 内层j会经过 0 1 2 3 4 -> 0 1 2 3 -> 0 1 2 -> 0 1 -> 0
*/
Scanner input = new Scanner(System.in);
int NUM = 5;
int[] a = new int[NUM];
System.out.println("请输入数字");
for(int i = 0; i < a.length; i++) {
a[i] = input.nextInt();
}
System.out.println("排序之前:");
for(int i : a) {
System.out.print(i + "\t");
}
// 冒泡排序
for(int i = 0; i < a.length - 1; i++) {
for(int j = 0; j < a.length - 1 - i; j++) {
//把符合条件的数进行交换
if(a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
//不妨把每次执行的过程输出来观察观察
//前面引入了Arrays包便可以引用Arrays.toString(int[] a)将a数组(对象)的当前内容输出在console
System.out.println(Arrays.toString(a));
}
System.out.println("#############################");
}
System.out.println("\n排序之后:");
for(int i : a) {
System.out.print(i + "\t");
}
优化
所以我们需要在蓝色字体那一段之后的三次循环立刻结束,我们需要让计算机明白我们的意思
// 冒泡排序
for(int i = 0; i < a.length - 1; i++) {
//我们在此处加入标记
boolean flag = true;
for(int j = 0; j < a.length - 1 - i; j++) {
//把符合条件的数进行交换
if(a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
//若执行了if语句的内容,便实行了交换,我们给标记记为false
flag = false;
}
System.out.println(Arrays.toString(a));
}
//如果上个for都没有发生交换,说明已经交换好了,就可以直接结束了
//数组的内容交换了 flag就为false 这个if语句就不会执行break
//若flag为true 说明a数组里的数字已经不需要排序了,直接结束就好了
if(flag) {
break;
}
System.out.println("#############################");
}
之后还会有跟多的优化。