定时快速排序方法

时间:2018-03-13 00:05:19

标签: java arrays algorithm sorting

我正在编写一个程序来比较不同的排序算法速度。大多数情况下,我可以用

开始每个算法方法
long startTime = System.currentTimeMillis();

并以

结束
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime + " milliseconds");

但是,因为快速排序是递归的,所以这不会起作用,因为它会为每次递归打印一个时间,而不是总的经过时间。

我的代码

public static void quickSort(int[] arr, int low, int high) {

if (arr == null || arr.length == 0)
  return;

if (low >= high)
  return;

// pick the pivot
int middle = low + (high - low) / 2;
int pivot = arr[middle];

// make left < pivot and right > pivot
int i = low, j = high;
while (i <= j) {
  while (arr[i] < pivot) {
    i++;
  }

  while (arr[j] > pivot) {
    j--;
  }

  if (i <= j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    i++;
    j--;
  }
}

// recursively sort two sub parts
if (low < j)
  quickSort(arr, low, j);

if (high > i)
  quickSort(arr, i, high);

if ((low >= j) && (high <= i)) {




}


}

我怎样才能使它只运行&#34; stopTime&#34; algorthim的最后一次迭代。感谢

1 个答案:

答案 0 :(得分:-1)

不要测量递归方法中的性能。可以在某些private 辅助方法中移动方法的核心代码,也可以在调用它的方法中进行衡量,例如在main方法中。

辅助方法变体:

public static void quickSort(int[] arr, int low, int high) {
    long startTime = System.currentTimeMillis();

    // Call the helper
    quickSortHelper(arr, low, high);

    long stopTime = System.currentTimeMillis();
    long elapsedTime = stopTime - startTime;
    System.out.println(elapsedTime + " milliseconds");
}

private static void quickSortHelper(int[] arr, int low, int high) {
    // All code goes here, adjust calls
    // to 'quickSort', they should now call 'quickSortHelper'
}

请注意,您的技术只是获得粗略估算的快捷方式。如果像这样做,有很多效果会弄乱你的微基准测试。例如JVM噪音(启动时),特别是缓存效果(对具有相同或类似输入的方法的重复调用将非常快,因为它们已经被缓存)。

您可以阅读此问题以获取更多详细信息:How do I write a correct micro-benchmark in Java?