【问题标题】:number of comparisons median quicksort比较次数中位数快速排序
【发布时间】:2014-11-22 12:29:37
【问题描述】:

如何计算中位数快速排序中的比较次数?我必须在哪里增加我的计数器来计算这个?我的中位数快速排序代码如下:

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 比较,但我该如何计算呢?

【问题讨论】:

    标签: quicksort median


    【解决方案1】:

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

    一种更骇人听闻的方法是直接在您的代码中进行检测。查找代码中发生比较的每个位置并增加一个计数器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多