编辑代码

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

class Main {
	public static void main(String[] args) {
        int arr[] = {3, 9, -1, 10, -2};
        // arr = new int[]{1,2,3,4,5,6};
        // originalSort(arr);
        // bubbleSort(arr);
        // upgradeBubble(arr);
        // System.out.println("排序完成");
        //测试一下冒泡排序的速度O(n^2),给8万个数据,测试
        //创建80000个随机的数组
        int[] datagram = randomData(24000);
        //System.out.println(Arrays.toString(datagram));
        //System.out.println("排序前的时间是 = " + statisticTime());
        upgradeBubble(datagram);
        //System.out.println("排序后的时间是 = " + statisticTime());
    }

    public static int[] randomData(int extension) {
        int i = 0;
        int[] datagram = new int[extension];
        while (i < extension) {
            datagram[i] = ((int) (Math.random() * extension)) + 1;
            i++;
        }
        return datagram;
    }

    public static String statisticTime() {
        return new SimpleDateFormat("HH:mm:ss").format(new Date());
    }

    public static String statisticMills(){
        return System.currentTimeMillis() + "";
    }

    public static void originalSort(int[] arr) {
        //第一趟排序,就是将最大的数排在最后
        int temp = 0;
        for (int j = 0; j < arr.length - 1; j++) {
            //如果前面的数比后面的大,就交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        System.out.println("第一趟排序的数组:");
        System.out.println(Arrays.toString(arr));

        //第二趟排序,就是将第二大的数排在倒数第二位
        for (int j = 0; j < arr.length - 1 - 1; j++) {
            //如果前面的数比后面的大,就交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第二趟排序的数组:");
        System.out.println(Arrays.toString(arr));

        //第三趟排序,就是将第三大的数排在倒数第三位
        for (int j = 0; j < arr.length - 1 - 2; j++) {
            //如果前面的数比后面的大,就交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第三趟排序的数组:");
        System.out.println(Arrays.toString(arr));

        //第四趟排序,就是将第四大的数排在倒数第四位
        for (int j = 0; j < arr.length - 1 - 3; j++) {
            //如果前面的数比后面的大,就交换
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }

        System.out.println("第四趟排序的数组:");
        System.out.println(Arrays.toString(arr));
    }

    public static void bubbleSort(int[] arr) {
        int temp = 0;
        int len = arr.length - 1;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.printf("第%d趟排序的数组\n", i + 1);
            System.out.println(Arrays.toString(arr));
        }
    }

    public static void upgradeBubble(int[] arr) {
        int temp = 0;
        int len = arr.length - 1;
        boolean flag = false;//标示变量,表示是否进行过交换
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    flag = true;//如果这一轮没有任何交换的操作,说明已经完成排序
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            if (!flag) {//如果一趟排序,一次交换都没有发生过
                break;
            } else {
                flag = false;//重置flag,进行下次判断
            }
            System.out.printf("第%d趟排序的数组\n", i + 1);
            System.out.println(Arrays.toString(arr));
        }
    }
}