Quicksort - 排序数组速度较慢?

时间:2014-05-04 13:22:14

标签: java performance sorting optimization quicksort

所以我正在尝试一些排序算法。

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。那是为什么?

2 个答案:

答案 0 :(得分:3)

我能说到目前为止最好的是你应该仔细检查你的时间。一般来说,这样的分析应该是多次运行的平均值。我根据你的代码制作了一个测试类并得到了这些结果:

graph of results confirming common sense

这是使用System.nanoTime()作为我的分析工具完成的。没什么好看的。

编辑: Here's a link到我写的分析类。它以类似CSV的格式输出结果,因此我可以在电子表格程序中制作图表。

答案 1 :(得分:-2)

quickSort算法的最坏情况是对数组进行排序或几乎排序。这很可能是为什么它需要你更长的时间来排序已经排序的数组。