1

サイズが 500 万になる可能性のある 2 つの int 配列 *start と *end があります。*start にはエッジの開始ノード番号が格納され、*end には終了ノード番号が格納されます。ここで、*start を昇順で並べ替え、並べ替え前のように新しい順序付けスキームを格納します。

start[0] = 5
start[1] = 7
start[2] = 8
start[3] = 1
start[4] = 4

ソート後、

start[0] = 1
start[1] = 4
start[2] = 5
start[3] = 7
start[4] = 8

また、「3 4 0 1 2」である新しい順序付けスキームを保存したいと考えています。この新しい順序付けスキームを保存したい理由は、再配置 *end を使用する必要があるからです。C ライブラリには関数 qsort() がありますが、ソート ジョブしか実行できず、順序付けスキームは保存されません。両方を実行できる他の機能はありますか?または、自分で関数を作成する方法は? どうもありがとう。

4

2 に答える 2

1

おそらく、使用しているデータ構造を確認する必要があります。使用する場合:

struct data
{
    int start;
    int end;
};

次に、この構造体の単一の配列を割り当て、標準qsort()関数を使用して 1 回 (1 回) 並べ替えることができます。end開始値と終了値は同じ構造体のメンバーであるため、並行して移動されるため、配列を並べ替えるために並べ替え順序配列は必要ありません。

int data_cmp(const void *vp1, const void *vp2)
{ 
    const struct data *dp1 = vp1;
    const struct data *dp2 = vp2;
    if (dp1->start < dp2->start)
        return -1;
    else if (dp1->start > dp2->start)
        return +1;
    else
        return 0;
}

そして、他の関数で:

size_t nitems = 5000000;
struct data *array = malloc(nitems * sizeof(*array));

// ...load the array with start and end point values...

qsort(array, sizeof(array[0]), nitems, data_cmp);
于 2013-04-09T04:29:44.137 に答える