【问题标题】:what happened when using qsort function?使用 qsort 函数时发生了什么?
【发布时间】:2013-05-18 20:27:24
【问题描述】:

我正在尝试按变量a对struct节点进行排序,结果结果是错误的。

我的结果:

{5, 4},  {6, 2},  {7, 3},  {4, 1},  {3, 7},  {1, 3},  {0, 0},

我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int x;
    int y;
} n;

int num = 7;

int compare(const void *ele1, const void *ele2) {
    n *px, *py;
    px = (n *) ele1;
    py = (n *) ele2;
    return px->x < py->x;
}

int main() {
    n node[7] = {
    {4, 1},
    {6, 2},
    {1, 3},
    {5, 4},
    {7, 3},
    {3, 7}
    };
    int i;
    qsort(node, num, sizeof (node[0]), compare);
    for (i = 0; i < num; i++)
        printf("{%d, %d},  ", node[i].x, node[i].y);
    return 0;
}

如果我只对六对元素进行排序,那么结果是:

{7, 3},  {6, 2},  {5, 4},  {4, 1},  {1, 3},  {0, 0},

这是正确的,但是当我尝试使用七个时,它显示了上面的结果。 有谁知道为什么会这样?谢谢!

【问题讨论】:

    标签: c qsort


    【解决方案1】:

    比较函数的结果应返回负数、0 或正数。您只返回 0 或 1。

    您的比较函数应该返回如下内容:

    return px->x < py->x ? -1 : px->x == py->x ? 0 : 1;
    

    或者更简洁但更不透明:

    return px->x - py->x;
    

    qsort reference。从技术上讲,它是一个 C++ 参考页面,但对 C 的解释也很好。

    附录

    我忘了解释发生了什么,对不起!您的比较函数执行以下操作。

    • 每当px-&gt;x &lt; py-&gt;x,您的函数返回 1,使其认为px 元组大于py 元组,而实际上并非如此。 (在这种情况下,您可能想返回一个负值。)

    • 每当px-&gt;x &gt;= py-&gt;x,您的函数返回0,使qsort 认为这两个值相等,而实际上它们可能相等,也可能不相等。

    所以qsort 只是根据您的比较函数告诉它的顺序盲目地分区和交换元素。由于您的函数只返回“相等”(0)或“更大”(1),而不是“更少”,因此最终结果变得相当混乱。

    【讨论】:

    • qsort 是一个 C 标准函数,比较函数的规范甚至符合以下注释:“数组的内容根据指向的比较函数按升序排序compar, 使用两个指向被比较对象的参数调用。如果第一个参数被认为分别小于、等于或大于零,则函数应返回一个小于、等于或大于零的整数第二个。"
    猜你喜欢
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多