排序
1)基本数据类型
int[] / long[] / double[] 这种原始类型数组:最简洁也最快
直接用:
Arrays.sort(arr);
这是原地排序(不额外开同等大小数组),底层对原始类型用的是 Dual-Pivot Quicksort(双轴快排)这类工程化实现,平均很快,刷题完全够用。
2)引用数据类型
Integer[] / String[] / 自定义对象[] 这种对象数组:需要比较器
最常见:
Arrays.sort(arr);(元素自己实现了 Comparable,比如 String/Integer)Arrays.sort(arr, comparator);(你要自定义规则时)
对象数组底层通常是 TimSort(稳定排序),适合“部分有序”的数据,也很强。
注意一个刷题坑:int[] 不能直接传 comparator。想按自定义规则,你必须:
要么转
Integer[]要么自己写排序逻辑(比如桶/计数/自定义 key 的间接排序)
3)list类
List<T>:一句话排序
List: ArrayList / LinkedList / Vector
list.sort(Comparator.naturalOrder())list.sort(Comparator.reverseOrder())list.sort((a,b)->Integer.compare(a,b))Collections.sort(list)/Collections.sort(list, cmp)list.sort(comparator);(更顺手)
刷题里我更爱 list.sort(...),因为读起来更“就地操作”。
4)其他
想要“更快”的排序:别指望 API,靠题型 🧠
当你说“最快”,很多时候真正的提速来自不用比较排序:
值域小:计数排序 / 桶排序(
O(n + V))只要 TopK:堆(
PriorityQueue)或 quickselect(O(n)平均)排序的是 0/1/2:三路 partition(荷兰国旗)
排序的是“按 key 分组”:哈希 + 桶
这些往往能把 O(n log n) 直接打到 O(n) 或更贴题的复杂度,比任何 API 都“快”。
我给你的默认选择(刷题最省心版)
- 原始数组:
Arrays.sort(arr); - 对象数组 / 需要自定义规则:
Arrays.sort(arr, (a,b)->...); - List:
list.sort((a,b)->...);
基数排序
当值域小且是整数时,优先想计数/桶;
1 | private void sort(int[] nums) { |