比较次数中位数快速排序

时间:2014-09-27 17:44:27

标签: quicksort median

如何计算中值快速排序的比较次数?我必须在哪里增加计数器才能计算出来?我的中间快速排序代码如下:

void my_swap(vector<int>&vect, int dex1, int dex2) {
   int temp = vect[dex1];
   vect[dex1] = vect[dex2];
   vect[dex2] = temp;
}
int find_median(vector<int>&vect, int p, int r) {
   int center = (p + r) / 2;
   if (vect[p] > vect[center])
      my_swap(vect, p, center);
   if (vect[p] > vect[r])
      my_swap(vect, p, r);
   if (vect[center] > vect[r])
      my_swap(vect, center, r);
   my_swap(vect, center, r - 1);
   return vect[r - 1];
}
void standart_sort(vector<int>&vect, int p, int r) {
   if (r - p + 1 <= 1){
      return;
   }
   if (r - p + 1 == 2) {
      if (vect[p] > vect[r]){
         my_swap(vect, p, r);
      }
      return;
   } else {
      if (vect[p] > vect[r - 1]){
         my_swap(vect, p, r - 1);
      }
      if (vect[p] > vect[r]){
         my_swap(vect, p, r);
      }
      if (vect[r - 1] > vect[r]){
         my_swap(vect, r - 1, r);
      }
   }
}
int partition_for_median(vector<int>&vect, int p, int r, double pivot) {
   double x = pivot;
   int i = p - 1;
   for(int j = p; j <= r - 1; j++)
   {
      counter++; //pasted here
      if(vect[j] <= x)
      {
         i++;
         my_swap(vect, i, j);
      }
   }
   my_swap(vect, i + 1, r);
   return i; 
}
void quick_sort_median(vector<int>&vect, int p, int r) {
   if (r - p + 1 <= 3){
      counter2++;
      standart_sort(vect, p, r);
   }
   else {
      double median = find_median(vect, p, r);
      int partition = partition_for_median(vect, p, r, median);
      quick_sort_median(vect, p, partition - 1);
      quick_sort_median(vect, partition + 1, r);
   }
}

例如,在此数组{3,7,5,1,9,6,4,10,8,2}中有25个比较,但我该如何计算呢?

1 个答案:

答案 0 :(得分:0)

您可以使用自定义比较函数执行常规整数比较,但也可以增加全局计数器。类似的想法是将int包装在一个自定义类中,并使用自己的比较函数执行类似的操作。该类将有一个静态计数器。

更骇人的方法是直接在代码中执行检测。找到代码中发生比较的每个地方并增加一个计数器。