2012-03-10 103 views
2

我实现了一个简单的快速排序(下面的代码)来计算由quicksort进行的平均和最差比较。我宣布了一个全局变量来存放用于比较的计数器。我将3个计数器置于不同的位置,我认为会计算比较结果,问题是计数器总数与快速排序进行的比较总数的理论值不匹配。我试图解决这个问题好几个小时,但总结出来了。我非常感谢,如果你能指出我应该把柜台放在哪里,为什么我应该把它们放在那里。我假设一个柜台应该去哪里进行比较。显然我错了。计算快速排序比较

public int[] quickSort(int[] array, int start, int end){ 


    if (start < end){ 
     counter++;//1st comparison here 
     int pivot; 

     pivot = Partition(array, start, end); 
     quickSort(array, start, pivot - 1); 
     quickSort(array, pivot + 1, end); 
    } 
return array; 
} 

private int Partition(int[] array, int start, int end) { 
    int pivot = array[end]; 
    int i = start - 1; 

    for(int j = start; j <= end - 1; j++){ 

     counter++;//2nd comparison here 


     if (array[j] <= pivot){ 
      counter++;//3rd comparison here 
      i = i + 1; 

      int temp = array[i]; 
      array[i] = array[j]; 
      array[j] = temp; 
     } 

    } 

    int temp = array[i+1]; 
    array[i+1] = array[end]; 
    array[end] = temp; 

    return i + 1; 
} 
+0

第一次调用'quicksort'如何?您还可以发布一些比较理论和实际数量的例子。 – 2012-03-10 12:12:49

+0

即时选择最后一个元素作为主题。我试着只留下第三个计数器,但我的计数器增加了近25%,即时计算理论值为SIZE *(SIZE-1)/ 2,其中SIZE是最差情况下的数组大小。第一个调用看起来像quickSort(testArray,0,testArray.length - 1) – David 2012-03-10 12:20:19

+0

1000个随机生成的数字存储在一个数组中,预期值大约是499500 – David 2012-03-10 12:23:50

回答

2

对于理论,只有数组元素的比较都算,指数不攀比界限,所以你应该只留下第二counter++;(你需要独立递增的结果的计数器比较)。

然后就是你比较哪个理论值的问题。有不同的quicksort实现使用稍微不同数量的比较。特别是,你选择的pivot不会避免极端的值,所以这个实现很容易降级到O(n^2)行为。

+0

是的,我故意这样做,选择最后一个要素作为支点。我试着只留下第三个计数器,但我的计数器增加了近25%,即时计算理论值为SIZE *(SIZE-1)/ 2,其中SIZE是最差情况下的数组大小。 – David 2012-03-10 12:16:41

+0

哎呀,应该是第二个,不是第三个,请参阅编辑。因此,在循环中,您可以进行“结束开始”比较。如您所期望的那样,最多可产生“SIZE *(SIZE-1)/ 2”比较。如果在拿出另一个'counter ++;'后得到不同的结果,我不知道会发生什么,必须进行调查。 – 2012-03-10 12:27:52

+0

谢谢你,你是正确的第三个计数器工作 – David 2012-03-10 12:27:54