关于使用Java中Arrays.sort()方法TLE

Posted Live In A Dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于使用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[]的情况下,同样超时,与预想结果不同,先记录下这个问题,暂时还没时间细究。

以上是关于关于使用Java中Arrays.sort()方法TLE的主要内容,如果未能解决你的问题,请参考以下文章

关于JAVA数组,Arrays为啥直接可以使用sort方法不用建对象

Java 7 是不是对方法 Arrays.Sort 使用 Tim Sort?

java中 Arrays.sort()这个函数 我想用它API中提供的sort(T[] a, Comparator<? super T> c)

Arrays 类操作 Java 的数组排序

深入理解Arrays.sort() (转)

使用 Arrays 类操作 Java 中的数组