如何计算中值快速排序的比较次数?我必须在哪里增加计数器才能计算出来?我的中间快速排序代码如下:
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
个比较,但我该如何计算呢?
答案 0 :(得分:0)
您可以使用自定义比较函数执行常规整数比较,但也可以增加全局计数器。类似的想法是将int包装在一个自定义类中,并使用自己的比较函数执行类似的操作。该类将有一个静态计数器。
更骇人的方法是直接在代码中执行检测。找到代码中发生比较的每个地方并增加一个计数器。