使用qsort函数时发生了什么?

时间:2013-05-18 20:27:25

标签: c qsort

我正在尝试按变量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},

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

1 个答案:

答案 0 :(得分:7)

比较函数的结果应返回负数,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->x < py->x,您的函数返回1,使其认为px元组更大而不是py元组,实际上是什么不是。 (在这种情况下,您可能希望返回负值。)

  • 每当px->x >= py->x时,您的函数返回0,使qsort认为这两个值相等,实际上它们可能已经存在,也可能没有。

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