我正在尝试一些排序算法。
private static void quicksort(int[] list, int low, int high){
int pivot = list[low + (high-low)/2];
int i = low;
int j = high;
while (i <= j) {
while (list[i] < pivot) {
i++;
}
while (list[j] > pivot) {
j--;
}
if (i <= j) {
int temp = list[i];
list[i] = list[j];
list[j] = temp;
i++;
j--;
}
}
if (low < j){
quicksort(list, low, j);
}
if (i < high){
quicksort(list, i, high);
}
}
这段代码运行在两个整数数组上,每个数组有x个条目(假设为10亿)。第一个数组已排序,第二个数组是对数组1的排列,其中n对随机选择并交换。
我选择中间元素作为枢轴,因此它应该对于已排序的情况是最优的,对吧?
我正在测量算法对每个数组进行排序所需的时间,并计算出发生多少次交换和递归步骤。正如预期的那样,这些值在对带有随机排列的数组2进行排序时都更高。
但是:直到我达到较高数量的排列之前,算法仍需要较长的时间来处理已排序的数组。当n=10000时,我得到未排序数组的20ms和已排序数组的30ms。为什么会这样?
System.currentTimeMillis()
或者System.nanoTime()
的方法,并计算时间差。如果确实是这样的话:Java 有一个即时编译器(JIT),要测量特定方法的性能非常困难。同时请参阅 https://dev59.com/hHRB5IYBdhLWcg3wz6UK。 - Marco13