Java系统排序

5 Java系统排序

  • JDK 提供的排序方法 Arrays.sort(array)的效率要比前两篇文章所写的选择排序、冒泡排序等效率高。在做比较之前,先介绍一个方法 System.currentTimeMillis(),通过该方法可以得到格林威治时间自 1970 年 1 月 1 日凌晨 00:00:00 到当前系统时间的毫秒数(返回值为 long 类型)。
        long time = System.currentTimeMillis();
        System.out.println(time);// 1626489876906
  • 在这里有一个疑问,long 类型的范围表示够不够大?我们做个测试:
  • 第 1 步,我们可以通过这个方法得到当前的年份。
        long time = System.currentTimeMillis();
        long year = time / 1000 / 60 / 60 / 24 / 365 + 1970;
        System.out.println(year);// 2021
  • 第 2 步,long 类型能表示的最大年份.
        long time = Long.MAX_VALUE;// 0x7fffffffffffffffL
        long year = time / 1000 / 60 / 60 / 24 / 365 + 1970;
        System.out.println(year);// 292473178(可表示至2亿年)
  • 接下来我们回归主题,比较 Arrays.sort()排序、冒泡排序、选择排序以及插入排序的效率
    public static void main(String[] args) {
        int[] arr = new int[20000];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt();// 随机生成一个整数赋值给数组元素
        }
        // 拷贝四个数组副本
        int[] arr1 = Arrays.copyOf(arr, arr.length);
        int[] arr2 = Arrays.copyOf(arr, arr.length);
        int[] arr3 = Arrays.copyOf(arr, arr.length);
        int[] arr4 = Arrays.copyOf(arr, arr.length);

        // 计算Arrays.sort() 排序花费的时间
        System.out.println("系统排序");
        long start = System.currentTimeMillis();
        Arrays.sort(arr1);
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        // 计算选择排序花费的时间
        System.out.println("选择排序");
        start = System.currentTimeMillis();
        selectSort(arr2);
        end = System.currentTimeMillis();
        System.out.println(end - start);

        // 计算冒泡排序花费的时间
        System.out.println("冒泡排序");
        start = System.currentTimeMillis();
        bubblingSort(arr3);
        end = System.currentTimeMillis();
        System.out.println(end - start);

        // 计算插入排序花费的时间
        System.out.println("插入排序");
        start = System.currentTimeMillis();
        insertSort(arr4);
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[i]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

    public static void bubblingSort(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 temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    public static void insertSort(int[] arr) {
        int i, j, temp;
        for (i = 1; i < arr.length; i++) {
            temp = arr[i];
            for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
        }
    }

运行结果:

系统排序
11
选择排序
268
冒泡排序
353
插入排序
38

可见,冒泡排序、选择排序、插入排序以及系统排序效率依次增高,而系统排序仅需11毫秒

  • 注意:

    • 运行结果为 0 表示不到 1 毫秒内就完成了排序
    • 不要试图在控制台输出数组元素,控制台打印输出不全
  • JDK 提供的方法(比如 Arrays.sort(array))在官方提供的 API 帮助文档中可以查询到,在 Oracle 的官方网站可以下载到,如图所示:

  • 首先查到Arrays类
    在这里插入图片描述

  • 再查询Arrays类下的方法
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值