Java 快速排序方法的计时

Java 快速排序方法的计时,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,我正在写一个程序来比较不同的排序算法的速度。在大多数情况下,我可以从每个算法开始 long startTime = System.currentTimeMillis(); 并以 long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime + " milliseconds"); 但是,因为快速排序是递归的,所以它无法工作,因

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

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)) {




}


}
publicstaticvoidquicksort(int[]arr,int-low,int-high){
如果(arr==null | | arr.length==0)
返回;
如果(低>=高)
返回;
//选择支点
int middle=低+(高-低)/2;
int pivot=arr[中间];
//使左<枢轴和右>枢轴
int i=低,j=高;
而(我){
j--;
}
如果(i)
快速排序(arr、i、高);

if((low>=j)&(high不度量递归方法内部的性能。要么在一些
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噪音(在启动时),尤其是缓存影响(使用相同或类似输入重复调用该方法会非常快,因为它们已经被缓存)


您可以阅读此问题以了解更多详细信息:

请注意,使用
System.currentTimeMillis
通常并不是衡量算法性能的好方法。除了使用像JMH这样的完整基准测试工具之外,几乎没有什么方法可以获得准确、有用的性能比较用另一种方法。然后你就可以从最上层的时间里包装方法。