我正在尝试按变量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时,它会显示上面的结果。 有谁知道为什么会这样?谢谢!
答案 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),而且从不“减少”,最终结果变得相当混乱。