直接用arrays.sort(long[])即可,它基于双轴快排,原地排序、内存友好,支持空数组等边界情况,时间复杂度o(n log n);降序需转long[]或升序后翻转。

直接用 Arrays.sort(long[]) 就行,它底层采用双轴快排(Dual-Pivot Quicksort),专为基本类型优化,百万级 long[] 排序通常在毫秒级完成——关键不是换算法,而是避开误用和低效操作。
长整型数组默认升序,无需额外参数
long[] 是基本类型数组,Arrays.sort(long[]) 重载方法开箱即用:
- 原地排序,不创建新数组,内存友好
- 自动处理边界情况:空数组、单元素、含重复值、全负数或极大值(如
Long.MAX_VALUE)均无异常 - 时间复杂度稳定在 O(n log n),最坏情况也远优于朴素快排(因双轴分治+小数组切回插入排序)
降序不能直接传 Comparator,得绕一下
long[] 不支持泛型,所以 Arrays.sort(arr, Collections.reverseOrder()) 编译不通过。正确做法有两种:
-
转成 Long[] 再排:适合数据量不大(如 ≤10 万)且需频繁降序的场景
Long[] boxed = Arrays.stream(longs).boxed().toArray(Long[]::new);<br>Arrays.sort(boxed, Collections.reverseOrder());
⚠️ 注意:百万级装箱会触发大量 GC,慎用 -
升序后手动翻转:零额外对象,适合纯性能优先场景
Arrays.sort(longs);<br>for (int i = 0, j = longs.length - 1; i long tmp = longs[i];<br> longs[i] = longs[j];<br> longs[j] = tmp;<br>}
局部排序与 top-K 场景要写对索引
用 Arrays.sort(long[], from, to) 时,to 是右边界(不包含),这是高频出错点:
- 想排前 1000 个元素?写
Arrays.sort(arr, 0, 1000),不是1001 - 想排最后 500 个?写
Arrays.sort(arr, arr.length - 500, arr.length) - 只取最大 K 个?全量排序浪费资源——改用
PriorityQueue<long></long>(大顶堆)或Arrays.parallelSort()配合截断更合适
比 Arrays.sort() 更快的替代方案(特定场景)
双轴快排已极优,但以下情况可考虑其他策略:
- long 值范围集中且有限(如日志时间戳落在某 24 小时内,精度到毫秒,总数约 86400000 个可能值):改用计数排序,时间复杂度 O(n + range),实测快 3–4 倍
-
只需随机打乱:别用
sort配Math.random()比较器(结果不可靠且慢),直接ThreadLocalRandom.current().nextLong()配 Fisher-Yates 原地洗牌 -
数据持续追加、需动态有序:数组不再适用,换成
TreeSet<long></long>或带排序能力的流式结构(如 Apache Commons Collections 的 TreeList)











