所以我正在尝试一些排序算法。
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都包含x个(简称10亿个)。第一个是排序的,第二个是数组1的排列,其中n对是随机选择和切换的。
我选择中间元素作为枢轴,因此对于已排序的案例应该是最佳的,对吗?
我正在测量算法对每个数组进行排序所花费的时间,并计算出递归的次数和次数。正如预期的那样,对于具有随机排列的阵列2,这两个值都更高。
但是:算法仍然需要更长的时间来处理已排序的数组,直到我达到大量的排列。对于n = 10000,对于未排序的数组,我得到20ms,对于排序的数组,得到20ms。那是为什么?
答案 0 :(得分:3)
我能说到目前为止最好的是你应该仔细检查你的时间。一般来说,这样的分析应该是多次运行的平均值。我根据你的代码制作了一个测试类并得到了这些结果:
这是使用System.nanoTime()
作为我的分析工具完成的。没什么好看的。
编辑: Here's a link到我写的分析类。它以类似CSV的格式输出结果,因此我可以在电子表格程序中制作图表。
答案 1 :(得分:-2)
quickSort算法的最坏情况是对数组进行排序或几乎排序。这很可能是为什么它需要你更长的时间来排序已经排序的数组。