9

私の問題は次の問題です(問題を示す簡単な例です):

私は持っています:

int* array1;
double* array2. 

array1=new int[10];
array2=new double[10];
array1=filledWithIntegers(random);
array2=filledWithDoubles(random);

//ここでは、array2の値に基づいてarray1を並べ替えます。stdlibのqsort関数を使おうとしています。qsort(array1,6、sizeof(int)、compare);

重要なのは、array2に基づいてorderarray1の比較関数を作成する方法です。

stdライブラリのデータ構造を使用することはできません。配列ポインタで直接実行する必要があります。

ありがとう。

4

3 に答える 3

8

の整数をarray1並べ替える代わりに、を使用してインデックスを並べ替えてアイテムを比較し、並べ替えから取得した順列に従ってarray2[index]再配置します。array1

これが簡単なデモです:

#include <stdio.h>
#include <stdlib.h>

int array1[] = {1, 7, 3, 9, 5};
double array2[] = {1.1, 7.7, 3.3, 9.9, 5.5};

int compare (const void * a, const void * b) {
    double diff = array2[*(int*)a] - array2[*(int*)b];
    return  (0 < diff) - (diff < 0);
}

int main(void) {
    int perm[5], i;
    int res[5];
    for (i = 0 ; i != 5 ; i++) {
        perm[i] = i;
    }
    qsort (perm, 5, sizeof(int), compare);
    for (i = 0 ; i != 5 ; i++) {
        res[i] = array1[perm[i]];
    }
    for (i = 0 ; i != 5 ; i++) {
        printf("%d\n", res[i]);
    }
    return 0;
}
于 2012-05-14T14:06:38.633 に答える
3

はい。2つの配列を1つのペアの配列にグループ化してから、比較関数を定義する必要があります。

比較関数は次のようになります。

bool compare(const pair<int,double>& t1, const pair<int,double>& t2){
    return (t1.second < t2.second);
}
于 2012-05-14T14:05:47.867 に答える
3

さて、あなたはあなたの比較関数の他の配列にインデックスを付けるために要素の位置を使用する必要があります(標準は比較関数のポインタ引数が常にソートされる配列を指すことを保証します):

int compare(const void *a, const void *b)
{
    unsigned int i = (const int*)a - array1;
    unsigned int j = (const int*)b - array1;
    if(array2[i] < array2[j])
        return -1;
    if(array2[i] > array2[j])
        return 1;
    return 0;
}

欠点は、比較関数が追加のパラメーターを受け取ることができないため、特定の配列を明示的に知る必要があることです。

qsortあなたの質問はC++とタグ付けされているので、とにかく使用について質問します。同じ問題がstd::sortありますが、依存する配列をカプセル化する比較ファンクターを使用することで、はるかに一般性/抽象化に到達できます。

于 2012-05-14T14:27:49.070 に答える