0

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

我的结果:

{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},

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

4

1 回答 1

7

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

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

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

或更简洁但更不透明:

return px->x - py->x;

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

附录

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

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

  • 无论何时px->x >= py->x,您的函数都返回 0,从而qsort认为这两个值相等,而实际上它们可能相等,也可能不相等。

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

于 2013-05-18T20:29:23.237 回答