qsort和std :: sort表现不同

时间:2016-11-27 07:59:30

标签: c++ sorting qsort

我很惊讶通过std::sortqsort排序会产生不同的结果。我需要帮助来解释以下代码段的行为:

  1. 使用// the following comparator has been used in qsort. // if l<r : -1, l==r : 0 , l>r 1 int cmpre(const void *l, const void *r) { if ((*(tpl *)l).fhf < (*(tpl *)r).fhf) return -1; else if ((*(tpl *)l).fhf == (*(tpl *)r).fhf) { if ((*(tpl *)l).nhf == (*(tpl *)r).nhf) return 0; else if ((*(tpl *)l).nhf > (*(tpl *)r).nhf) return 1; else return -1; } else return 1; } // and sort statement looks like : qsort(tlst, len, sizeof(tpl), cmpre);

    // the following comparator was used for sort 
    int cmpr(const tpl &l, const tpl &r) {
        if (l.fhf < r.fhf)
            return -1;
        else
        if (l.fhf == r.fhf) {
            if (l.nhf == r.nhf)
                return 0;
            else
            if (l.nhf > r.nhf)
                return 1;
            else
                return -1;
         } else
             return 1;
    }
    // and sort statement looks like : 
    sort(tlst, tlst + len, cmpr);
    

    完整代码链接=&gt; http://ideone.com/zN87tX

  2. 使用sort:

    compr

    =>&gt;处的完整代码链接 http://ideone.com/37Dc2S

  3. 您可以在排序操作之前和之后查看链接上的输出,并且可能希望查看用于比较两个元组的compresort方法。我不明白为什么qsort无法对数组进行排序,而func buttonAction(sender:UIButton) // this was throwing the error "unrecognized selector sent to instance" { println("tapped button") } func buttonAction(_ sender:UIButton) // added an "_ " before sender { println("tapped button") } 能够这样做。

1 个答案:

答案 0 :(得分:3)

cmpr()重写为

bool cmpr(const tpl &l, const tpl &r){
    if(l.fhf != r.fhf) return l.fhf < r.fhf;
    return l.nhf < r.nhf;
}

或者,您也可以重复cmpre()来实施cmpr()

bool cmpr(const tpl &l, const tpl &r) {
    return (cmpre(&l, &r) < 0);
}