zoukankan      html  css  js  c++  java
  • 关于Java中Arrays.sort()方法TLE

    最近一直在练用Java写题,今天无意发现一道很简单的二分题(链接),我一开始是直接开int[]数组调用Arrays.sort()去排序,没想到TLE了,原来是因为jdk中对于int[]的排序是使用快速排序的,jdk中相关调用源码如下

    1     public static void sort(int[] a) {
    2         DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    3     }
    View Code

    而测试数据恰好有反快排的数据,因此被卡。

    解决方法也不少,比较简单的是使用包装类Integer去调用Arrays.sort,jdk对之的实现是基于timsort的,可以从如下的源码看到相关调用。

    1     public static void sort(Object[] a) {
    2         if (LegacyMergeSort.userRequested)
    3             legacyMergeSort(a);
    4         else
    5             ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
    6     }
    View Code

    或者也可以用List,然后调用Collections.sort()。

    当然还可以先shuffle一下打乱数组,再调用排序,不过其实理论上来说还是有风险。

    CF上有一篇博文可以参考:http://codeforces.com/blog/entry/7108

    ---------------------------------------------------------------------------------

    6.20更新

    今天我用Arrays.parallelSort方法测试了一下,发现在使用包装类数组Integer[]的情况下比正常的Arrays.sort慢,在使用基本类型int[]的情况下,同样超时,与预想结果不同,先记录下这个问题,暂时还没时间细究。

  • 相关阅读:
    斜二进制数
    贝贝的波浪数
    1058: 电文保密
    1065: 贝贝的加密工作
    低危漏洞- X-Frame-Options Header未配置
    1064: 不明飞行物(ufo)
    支付
    1067: 密室寻宝(find)
    c++10进制转换为任意2-16进制数字
    1066: 单词游戏(game)
  • 原文地址:https://www.cnblogs.com/micrari/p/5573071.html
Copyright © 2011-2022 走看看