今天刷算法题,遇到一个排序类题目:largest-number,想了一个晚上加一个早上,终于AC了,看到别人的代码很简洁,瞬间觉得自己写的很low,不过有很多用java写的解法都用到了Arrays.sort()方法,之前用的很少,所以一直没怎么注意这个知识点。
于是决定看下这个方法的源码到底是如何进行排序的。
以整形数组为例进行分析,其他原始数据类型基本相似。
在java.util.Arrays类下
找到整形数组为参数的排序函数入口:
public static void sort(int[] a, int fromIndex, int toIndex) {
rangeCheck(a.length, fromIndex, toIndex);
sort1(a, fromIndex, toIndex-fromIndex);
}
rangeCheck方法:
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
其中rangeCheck方法用于检查fromIndex到toIndex范围在数组a的范围内,否则将抛出异常
sort1代码如下(分割几个部分介绍):
private static void sort1(int x[], int off, int len) {
// Insertion sort on smallest arrays
if (len < 7) {
for (int i=off; i<len+off; i++)
for (int j=i; j>off && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}
... ...