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;
}

要素のペアを 6 つだけ並べ替えると、結果は次のようになります。

{7, 3},  {6, 2},  {5, 4},  {4, 1},  {1, 3},  {0, 0},

これは正しいですが、7 で試したところ、上記の結果が表示されました。なぜそれが起こるのか誰か知っていますか?ありがとう!

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 にも適しています。

補遺

何が起こったのか説明するのを忘れました、ごめんなさい!比較関数は次のことを行います。

  • いつでも、関数は 1 を返し、タプルがタプルよりも大きいpx->x < py->xと考えさせますが、実際にはそうではありません。(この場合、おそらく負の値を返したいでしょう。)pxpy

  • いつでもpx->x >= py->x、関数は 0 を返し、実際にqsortは 2 つの値が等しい場合もそうでない場合もあるのに等しいと考えさせます。

qsortそのため、比較関数が順序を伝えていたことに従って、要素をやみくもに分割して交換するだけです。あなたの関数は「等しい」(0)または「大きい」(1)だけを返し、「小さい」ことは決して返さなかったため、最終結果はかなり混乱したものになりました。

于 2013-05-18T20:29:23.237 に答える