3

2D 配列 A があるとします。

    A[3][3] = { {1 ,4 ,7},
                {6 ,2 ,3},
                {3 ,5 ,5}
              }  

インデックスi(たとえば1)についてソートしたい結果は次のようになります

    A[3][3] = { {6 ,2 ,3},
                {1 ,4 ,7},
                {3 ,5 ,5}
              }  

0 についてソートすると、

    A[3][3] = { {1 ,4 ,7},
                {3 ,5 ,5},
                {6 ,2 ,3}
              }  

これを行うためにソート機能を使用する方法は?

4

4 に答える 4

2

C:

stdlib.hのqsortは、任意の長さと任意の要素サイズの配列を並べ替えます。目的を達成するには、これらの両方の情報を供給する必要があります。長さは数、要素サイズは数です。

これらに加えて、要素を比較する方法を知る必要があります。qsortは、署名 int (*)(void *, void *) を持つ関数ポインターを必要とします。この関数は、各要素へのポインタを使用して呼び出されます。これは、各行の最初の数値のアドレスになります。選択した要素を互いに比較するだけです。qsortは、 A < Bの場合はゼロ未満の数値、A == Bの場合はゼロ、A > Bの場合はゼロより大きい数値を期待します。これは、 AからBを減算することによって行われます。ポインターを取得したので、それらをint * にキャストし、インデックス演算子を使用して目的の位置を相互に比較できます。

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

const int sort_element = 1;// Choose a value from 0 to the column width

int intcmp( const void *a, const void *b ){
    const int *A = a;
    const int *B = b;
    return A[sort_element]-B[sort_element];
}
int main(){
    int a[3][3] = { 
        {1 ,4 ,7},
        {6 ,2 ,3},
        {3 ,5 ,5}
    };
    qsort( a, 3, sizeof(int)*3, intcmp);
}

ご覧のとおり、並べ替える要素ごとに 1 つの比較関数が必要です。

于 2013-05-23T15:18:32.153 に答える
1

C++11 を使用している場合:

次のように、列 ( col)で並べ替えを行います。

int col = 1;
std::sort(A, A+3, [=](const int* a, const int* b)
{
    return a[col] < b[col];
});

C++ を使用している場合 (つまり、C++11 より前):

次のように「less」操作のファンクター型を定義します。

class column_less
{
    int col;
public:
    column_less(int col) : col(col) { }
    bool operator()(const int* a, const int* b) const
    {
        return a[col] < b[col];
    }
}

次に、次のように列 ( col)で並べ替えを行います。

int col = 1;
std::sort(A, A+3, column_less(col));

std::sortドキュメンテーション

于 2013-05-22T22:23:52.330 に答える
0

qsort を試してみてください。stdlib.h にあると思います。ポインタを各行の最初の要素に並べ替えます。

于 2013-05-22T22:24:20.790 に答える
0

データ型がuint32_t. 次に、これを のソート項目として扱いますsizeof(uint32_t) * number_of_columns。比較関数を呼び出すと、この大きな項目が渡されます。比較関数は、渡されたもの (実際には行) 内の適切な要素を調べ、行内の要素を並べ替えます。

于 2013-05-22T22:24:28.893 に答える