簡體   English   中英

使用qsort函數時會發生什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM