排序
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)->...);
基数排序
当值域小且是整数时,优先想计数/桶;
代码块收起展开
private void sort(int[] nums) {
int max=0;
for(int x: nums) {
max=Math.max(max, x);
}
int[] cnt=new int[max+1];
for(int v: nums) {
cnt[v]++;
}
int index=0;
for(int i=1; i<=max; i++) {
while(cnt[i]>0) {
cnt[i]--;
nums[index++]=i;
}
}
}