[英]what happened when using qsort function?
我正在嘗試按變量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或一個正數。 您只返回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),而從不返回“小於”,因此最終結果非常混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.