冒泡思路用一个双重循环来解决问题
第一重循环设置起始位置,
第二重循环挨个比较把剩余数中最小数放在此位置
for(int i=0;i<arr.length-1;i++) {
for (int j = i; j < arr.length ; j++) {
if (arr[j ] < arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
当然我们在第二重循环中也可以依次两两比较(arr[j],arr[j+1])把较大数放在右侧,这样当一次循环结束后最大数就到了数组的最右端。
for(int i=0;i<arr.length-1;i++) {
for (int j = 0; j < arr.length-1-i ; j++) {
if (arr[j+1 ] < arr[j]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
现在已经完成了冒泡排序,我们想想如何优化。如果在一次循环中并没有发生交换那么说明所有交换已经完成,那么后续的操作就没有必要了。为此我们需要设定一个boolean型变量作为标记查看是否发生交换。
完整代码如下:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {3,4,2,6,5,7,8,1,4};
bubble(arr);
System.out.println(Arrays.toString(arr));
// System.out.println(arr.toString());
// 会提示错误[I@154617c输出的是java对象的 hashcode。要输出具体的内容,覆盖toString方法
}
public static void bubble(int[] arr){
boolean flag = true;
for(int i=0;i<arr.length-1;i++) {
for (int j = i; j < arr.length ; j++) {
if (arr[j ] < arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
flag = false;
}
}
if(flag){
break ;
}
}
}
}