为什么我会在Java中遇到奇怪的运行时?
我有一个使用快速排序算法对数组[500000]进行排序的项目, 我实现了如下快速排序:为什么我会在Java中遇到奇怪的运行时?,java,algorithm,data-structures,runtime,Java,Algorithm,Data Structures,Runtime,我有一个使用快速排序算法对数组[500000]进行排序的项目, 我实现了如下快速排序: public void sort (int[] array){ sort(array, 0, array.length - 1); } private void sort (int[] array, int start, int end){ if (start >= end) { return; } va
public void sort (int[] array){
sort(array, 0, array.length - 1);
}
private void sort (int[] array, int start, int end){
if (start >= end) {
return;
}
var boundary = partition(array, start, end);
sort(array, start, boundary - 1);
sort(array, boundary + 1, end);
}
private int partition(int[] array, int start, int end){
var pivot = array[end];
var boundary = start - 1;
for (int i = start; i <= end; i++)
if (array[i] <= pivot)
swap(array, i, ++boundary);
return boundary;
}
private void swap(int[] array, int index1, int index2){
var temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
这不会复制阵列:
var copiedaray=数组;
它所做的是声明另一个指向相同数组的变量。
在已排序的数组上运行快速排序
实际上,您需要执行以下操作,例如:
var copiedArray=Arrays.copyOf(array,array.length);
任何剩余的时间差异都可能是由于JIT优化造成的。使用一个基准系统来解释它们
编辑:现在您已经将其更改为两个不同的随机数组,因此运行时的差异现在是由于元素不同。Benchmark.NET?这在java世界不是一件事,也许@Fildor认为这是一个C#问题。正确的基准测试工具是。您确定已复制阵列吗?在已经排序的数组上运行快速排序可能非常慢。与其描述它,不如发布代码。什么是“第一个对象”?它有什么作用?它对数组进行排序吗?用什么方法?如果您发布一个,我们将能够亲自查看您是否真的在复制数组,其他对象是否做了比您想象的更聪明的事情等等。设置
startTime
并仅在sort(int[]array)
中计算时间跨度会更干净。当前,如果重用sorter类的实例,它将使用实例创建时的开始时间(因为这是设置startTime
时的开始时间),而不是开始排序时的开始时间。因此,该实例执行的每个后续排序似乎都比前一个要花费更长的时间。@OrangeDog;是的,我抄了。你可以在我发布的主类中看到。
public static void main(String[] args) {
var arrayBuilder = new ArrayBuilder();
var firstArray = arrayBuilder.getArray();
var secondArray = arrayBuilder.getArray();
var quickSort1 = new QuickSort();
long firstSortStart = System.nanoTime();
quickSort1.sort(firstArray);
long firstSortEnd = System.nanoTime();
long firstSortTotal = firstSortEnd - firstSortStart;
System.out.format("Original QuickSort (Version 1) took %d nano seconds. \n", firstSortTotal);
var quickSort2 = new QuickSort();
long secondSortStart = System.nanoTime();
quickSort2.sort(secondArray);
long secondSortEnd = System.nanoTime();
long secondSortTotal = secondSortEnd - secondSortStart;
System.out.format("Changed QuickSort (Version 2) took %d nano seconds. \n", secondSortTotal);
// this takes ~183861470 nano seconds
quickSorter2.sort(copiedArray);
// this takes ~218316931575 nano secondes