【问题标题】:Counting the number of comparisons in quicksort计算快速排序中的比较次数
【发布时间】:2014-10-27 22:58:37
【问题描述】:

我有一个作业,我需要用三个分区策略实现快速排序,并计算每个策略的比较次数。

为简单起见,每次我们对长度为 m 的数组进行递归调用时,都会要求我们将 m-1 添加到计数中。

我的代码总是返回一个负数,这不是整数溢出问题。
我用了long long int,现在还是有,而且比较的次数不可能增长这么多,所以我的计数方式有问题。

在调用我的实现之后,我使用is_sorted 在一个 100000 元素数组上测试了代码,它通过了,所以排序是正确的
这是我的代码:

long quick_sort (vector <int>& A, int l , int r){
    static  long count = 0;
    if ( r<= l)
        return 0;

    //partition
    int i = partition(A, l, r);

    //quicksort left
    int amount = ( ((i -1) -l) >= 0 ?
                            ((i-1) -l) :
                                    0);
    count += amount;
    quick_sort (A,l, i-1);

    //quicksort right
    amount = ((r - (i +1)) >= 0 ?
                        (r - (i +1)) :
                                  0);
    count += amount;
    quick_sort (A,i+1, r);

    return count;

}

【问题讨论】:

  • 作为一个建议:计算你在哪里进行比较,也就是int i = partition(A, l, r);这一行。更容易,更不容易出错。

标签: c++ algorithm sorting quicksort


【解决方案1】:

更改您的测试值以保持正确的表达式:

count += ( (i-1)-l >= 0 ? (i-1)-l : 0 )
quick_sort (A,l, i-1);

count += ( r-(i+1) >= 0 ? ...
quick_sort (A,i+1, r);

【讨论】:

  • (i-1) - l == i -1 - lr - i - 1 == r - (i+1),对吧?
  • @Mhd.Tahawi 不一定。用我的方式试试吧。
  • 成功了!!! ,尽管这违反了数学定律。 :D 你能解释一下为什么会这样吗?
  • 其实我不知道为什么你会得到错误的结果,但解决方案总是不假设任何事情。也许你有一个错字,你在编辑代码时无意中修正了它。
  • 其实没用> 照你说的加括号后贴代码,还是负数
【解决方案2】:

您的静态变量可能未按您的预期设置为 0。使其成为全局变量。

另外,为什么你在进行递归调用时而不是在调用时进行工作?做一次比做两次要容易得多。

【讨论】:

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