QSORT和STD ::排序的行为不同

qsort and std::sort behaving differently

本文关键字:排序 STD QSORT      更新时间:2023-10-16

我非常惊讶地,通过qsortstd::sort进行排序可以产生不同的结果。我需要帮助解释以下片段的行为:

  1. 使用qsort

    // 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);
    

    完成代码链接=>http://ideone.com/zn87tx

  2. 使用排序:

    // 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);
    

    完成代码链接=>http://ideone.com/37dc2s

您可以在分类操作后和之前看到链接上的输出,并且可能希望查看用于比较两个元组的comprcompre方法。我不明白为什么sort无法对数组进行排序,而qsort可以这样做。

重写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);
}