-1

qsortを使用してintのいくつかの異なる配列をソートしようとしていますが、ソートを実行していないようです。これが私のコンパレータ関数です。1つは順方向にソートし、もう1つは逆方向にソートします。

int comp(const void *elem1, const void *elem2){
    int x = *(int*)elem1;
    int y = *(int*)elem2;
    if(x > y) return 1;
    if (x < y ) return -1;
    return 0;
}

int compReverse(const void *elem1, const void *elem2) {
    int x = *(int*)elem1;
    int y = *(int*)elem2;
    if (x > y) return -1;
    if (x < y) return 1;
    return 0;
}

これが私がqsortと呼ぶところです。ソートされるアイテムはmallocされたint*sです。NELEMSは、配列の合計バイトサイズをintのサイズで除算して、配列の長さを取得する#defineです。

qsort(ascendingOrderArray, NELEMS(ascendingOrderArray),
            sizeof(*ascendingOrderArray),comp);
    qsort(descendingOrderArray, NELEMS(descendingOrderArray),
            sizeof(*descendingOrderArray), compReverse);

新しい配列を反復処理すると、期待した順序になりません。実際、それらはまったく順序がなく、最初の番号の配置を除いて、ソートされていない配列と区別できません。どうしたの?

4

1 に答える 1

4

ascendingOrderArrayを介して割り当てられると言うmalloc()ので、定義は次のようになります。

int *ascendingOrderArray;

NELEMS()しかし、配列のサイズをintのサイズで除算するように定義されていると言うので、定義は次のようなものだと思います。

#define NELEMS(x) (sizeof(x) / sizeof(int))

その場合、コードはあなたが思っていることをしていません。ここで、はポインタsizeof(ascendingOrderArray)のサイズを文字単位[1]で表したものです(32ビットシステムでは値は4になる可能性が高く、64ビットシステムでは8になります)。次に、整数のサイズで除算されます(32ビットシステムは4である可能性が高く、64ビットシステムは4である可能性があり、8である可能性があります。コンパイラによって異なります)。が1の値を返していても、驚くことではありません。NELEMS()qsort()

あなたがする必要があるのはqsort()次のように呼び出すことです:

qsort(ascendingOrderArray,itemsInArray,sizeof(int),comp);

ここitemsInArrayで、は割り当てられた配列内の要素数の個別のカウントです。

[1] Cではsizeof()、charのサイズに対する型のサイズを返します。sizeof(char)定義上1です。最近のほとんどのシステムでは、これもバイトですが、そうである必要はありません。

于 2013-02-24T06:00:10.640 に答える