初始代码:
public class bubbleSort {
public static void main(String[] args) {
int[]arr={1,3,5,7,4,6,8,9,0};
int[] sort = sort(arr);
System.out.print("[");
for (int i : sort) {
System.out.print(","+i);
}
System.out.print("]");
}
public static int[] sort(int[] arr){
for (int i=0;i< arr.length-1;i++){
for (int j=0;j< arr.length-1-i;j++){
if (arr[j]>arr[j+1]){
int c=arr[j];
arr[j]=arr[j+1];
arr[j+1]=c;
}
}
}
return arr;
}
}
思考:
如果排序过程中,已经是一个有序数组了,还需要接着排序吗?
当然是不需要,那么如何判定该数组已经是一个有序数组了呢?
一轮排序下来,元素之间两两比较,发现并没有发生交换,则该数组以及是一个有序数组了
优化代码:
public class bubbleSort {
public static void main(String[] args) {
int[]arr={1,3,5,7,4,6,8,9,0};
int[] sort = sort(arr);
System.out.print("[");
for (int i : sort) {
System.out.print(","+i);
}
System.out.print("]");
}
public static int[] sort(int[] arr){
for (int i=0;i< arr.length-1;i++){
//是否发生交换
boolean swapper=false;
for (int j=0;j< arr.length-1-i;j++){
if (arr[j]>arr[j+1]){
int c=arr[j];
arr[j]=arr[j+1];
arr[j+1]=c;
//表示发生了交换
swapper=true;
}
}
if (!swapper){
//未发生交换,直接结束循环
break;
}
}
return arr;
}
}
优化比较次数,将最后一次交换的索引,作为下一轮要比较的次数,如果交换次数为0,则已经有序
public class bubbleSort {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 4, 6, 8, 9, 0};
int[] sort = sort(arr);
System.out.print("[");
for (int i : sort) {
System.out.print("," + i);
}
System.out.print("]");
}
public static int[] sort(int[] arr) {
//下一轮要比较的次数
int count = arr.length - 1;
while (true) {
//最后一次交换的索引
int last = 0;
for (int j = 0; j < count; j++) {
if (arr[j] > arr[j + 1]) {
int c = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = c;
//把索引赋值
last = j;
}
}
count = last;
if (count == 0) {
//接下来要交换0次
break;
}
}
return arr;
}