3

2D 動的構造体配列のソートに問題があります。

私は構造体を持っています:

typedef struct abc
{
    int total;
} abc;

そして、動的な 2D 配列:

list = (abc**)malloc(listSize * sizeof(abc*));
    for (int i = 0; i < listSize; i++)
    {
        list[i] = (abc*)malloc(listSize2* sizeof(abc));
    }

ソートアルゴリズムを使用したい:

qsort(list, listSize, sizeof list[0], cmp);

そしてqsortの比較機能:

int cmp(const void *l, const void *r)
{
    const abc *a = *(const abc **)l;
    const abc *b = *(const abc **)r;

    return a[0].total > b[0].total;

}

しかし、問題は、小さなリスト (約 5 int など) では機能すると思いますが、リストが少し大きいと正しくソートできないことです。cmp() 関数が正しく動作するようにするにはどうすればよいですか?

ちなみに、list[x][0]後で要素を追加するので、並べ替えるだけで済みます。

(別の Stackoverflow 投稿からソート コードを基にしています)

4

2 に答える 2

5

比較関数を次のように変更します。

int cmp(const void *l, const void *r)
{
    const abc *a = *(const abc **)l;
    const abc *b = *(const abc **)r;

    return a[0].total - b[0].total;

}

予想される比較関数を使用qsortすると、最初の値が小さい場合は負が返され、2 つの値が等しい場合は 0 が返されます。

編集: WhozCraig に感謝: アンダーヒットまたはオーバーフローする可能性があると思われる場合は、より安全なバージョンを使用できます:

int cmp(const void *l, const void *r)
{
    const abc *a = *(const abc **)l;
    const abc *b = *(const abc **)r;

    if (a[0].total < b[0].total) {
       return -1;
    } else if (a[0].total > b[0].total) {
       return 1;
    } else {
       return 0;
    }
}
于 2013-09-27T09:01:00.400 に答える