qsort 比较器有什么问题?

问题描述 投票:0回答:1

所以我一直在做 C 方面的作业,有这样的任务: “给定一个整数数组,编写一个函数,按以下方式对它们进行排序: 首先,按非递减顺序排列的偶数, 第二,“奇数不增”。 例如,[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -> [2, 4, 6, 8, 10, 9, 7, 5, 3, 1]。

任务本身是关于正确编写 qsort 的比较器函数。我写了以下内容

cmp

int
cmp(const void *elem1, const void *elem2)
{
    int p_number1 = *(int *) elem1, p_number2 = *(int *) elem2, diff_flag = 0;
    if (p_number1 > p_number2) {
        diff_flag = 1;
    } else if (p_number1 < p_number2) {
        diff_flag = -1;
    }
    if ((p_number1 & 1) == (p_number2 & 1)) { // same parity
        return diff_flag == 0 ? 0 : diff_flag ^ ((p_number1 & 1) << 31);
        /* in even case, diff_flag will be returned, otherwise,
         * number with sign that is different from diff_flag's will be returned */
    }
    return (p_number1 & 1) - (p_number2 & 1); // if first is odd, and second is even, 1 is returned, and vice versa
}

测试系统会输出运行时错误。对于较小和较大的情况,它确实分别返回 INT_MIN 和 INT_MAX,但这不满足 qsort 的规范吗?此外,它在我本地测试的所有阵列上都运行良好。也许有人知道为什么会有 RE?

c qsort
1个回答
0
投票

我会尝试以可读、可理解的代码为目标,而不是依赖于整数位模式的知识,并使用异或和移位。

类似:

int cmp(const void *elem1, const void *elem2)
{
    int number1 = *(int *) elem1;
    int number2 = *(int *) elem2;
    int odd1 = number1 & 1;
    int odd2 = number2 & 1;
    int rv;

    if (odd1) {
        if (odd2)
            rv = number2 - number1;
        else
            rv = 1;
    } else {
        if (!odd2)
            rv = number1 - number2;
        else
            rv = 0;
    }
    return rv;
}

这也适用于不同大小的整数,而不是依赖于 32 位整数。

© www.soinside.com 2019 - 2024. All rights reserved.