5 Java系统排序
- JDK 提供的排序方法 Arrays.sort(array)的效率要比前两篇文章所写的选择排序、冒泡排序等效率高。在做比较之前,先介绍一个方法 System.currentTimeMillis(),通过该方法可以得到格林威治时间自 1970 年 1 月 1 日凌晨 00:00:00 到当前系统时间的毫秒数(返回值为 long 类型)。
long time = System.currentTimeMillis();
System.out.println(time);// 1626489876906
- 在这里有一个疑问,long 类型的范围表示够不够大?我们做个测试:
- 第 1 步,我们可以通过这个方法得到当前的年份。
long time = System.currentTimeMillis();
long year = time / 1000 / 60 / 60 / 24 / 365 + 1970;
System.out.println(year);// 2021
- 第 2 步,long 类型能表示的最大年份.
long time = Long.MAX_VALUE;// 0x7fffffffffffffffL
long year = time / 1000 / 60 / 60 / 24 / 365 + 1970;
System.out.println(year);// 292473178(可表示至2亿年)
- 接下来我们回归主题,比较 Arrays.sort()排序、冒泡排序、选择排序以及插入排序的效率
public static void main(String[] args) {
int[] arr = new int[20000];
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = r.nextInt();// 随机生成一个整数赋值给数组元素
}
// 拷贝四个数组副本
int[] arr1 = Arrays.copyOf(arr, arr.length);
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, arr.length);
int[] arr4 = Arrays.copyOf(arr, arr.length);
// 计算Arrays.sort() 排序花费的时间
System.out.println("系统排序");
long start = System.currentTimeMillis();
Arrays.sort(arr1);
long end = System.currentTimeMillis();
System.out.println(end - start);
// 计算选择排序花费的时间
System.out.println("选择排序");
start = System.currentTimeMillis();
selectSort(arr2);
end = System.currentTimeMillis();
System.out.println(end - start);
// 计算冒泡排序花费的时间
System.out.println("冒泡排序");
start = System.currentTimeMillis();
bubblingSort(arr3);
end = System.currentTimeMillis();
System.out.println(end - start);
// 计算插入排序花费的时间
System.out.println("插入排序");
start = System.currentTimeMillis();
insertSort(arr4);
end = System.currentTimeMillis();
System.out.println(end - start);
}
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
public static void bubblingSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void insertSort(int[] arr) {
int i, j, temp;
for (i = 1; i < arr.length; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
运行结果:
系统排序
11
选择排序
268
冒泡排序
353
插入排序
38
可见,冒泡排序、选择排序、插入排序以及系统排序效率依次增高,而系统排序仅需11毫秒
-
注意:
- 运行结果为 0 表示不到 1 毫秒内就完成了排序
- 不要试图在控制台输出数组元素,控制台打印输出不全
-
JDK 提供的方法(比如 Arrays.sort(array))在官方提供的 API 帮助文档中可以查询到,在 Oracle 的官方网站可以下载到,如图所示:
-
首先查到Arrays类
-
再查询Arrays类下的方法