package hike.array;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arr = {1, 3, 6, 8, 4, 2, 9, 4};
long bgTime = System.currentTimeMillis();
int[] result = bubbleSort2(arr);
long endTime = System.currentTimeMillis();
System.out.println(bgTime - endTime);
System.out.println(Arrays.toString(result));
}
// 冒泡排序 时间复杂度 O(n^2)
// 1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换它们的位置
// 2. 每一次比较,都会产生出一个最大,或者最小的数字
// 3. 下一轮则可以少一次排序
// 4. 依次循环,直至结束
public static int[] bubbleSort(int[] arr) {
for (int i = 0; i< arr.length - 1; i++){
for(int j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
}
}
return arr;
}
// 优化 如果是已经排序好的,就不用继续重新排序了
public static int[] bubbleSort2(int[] arr) {
for (int i = 0; i< arr.length - 1; i++){
boolean flag = false; // 通过flag标识位减少没有意义的循环操作,比较
for(int j = i + 1; j < arr.length; j++){
if(arr[i] > arr[j]){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
flag = true; // 只要排过序,就设置flag为true,下次不用再排序了
}
if (flag == false) { // 说明 数组没有进行排序操作,说明数组是已经排序好了的,直接跳出循环
break;
}
}
}
return arr;
}
}