別の配列で定義された並べ替え順序に従って、配列を所定の位置に並べ替えます

secretpow

別の配列の並べ替え順序を定義する配列があります。例えば、から成るアレイをソートするためにchar * data[] = {"c", "b", "a"};sort_order配列は次のようになり{2, 1, 0}-アレイがソートされるときに、最初の要素がなければならない"c"(ありますdata[sort_order[0]])。

(この背景には、並べ替える配列が2つありますが、2番目の配列は最初の配列と同じ並べ替え順序を使用する必要があります。したがって、基本的に{0, 1, 2}は最初の配列の値を使用して並べ替えてから、この並べ替え順序は、両方の配列の実際の値を並べ替えます。)

明らかな解決策は、配列(new_data)のコピーを作成し、並べ替え順序で定義されている正しい値をすべての要素に割り当てることです。

for (int i = 0; i < n; ++i)
{
    new_data[i] = data[sort_order[i]];
}

ただし、これにはアレイのコピーを作成する必要があります。配列をコピーせずに、元の配列の要素を交換して所定の位置に並べ替える方法はありますか?

編集:「重複の可能性」は別の配列を使用しますが、これはまさに私が避けようとしていることです。

rcgldr

「サイクル」を回転させることにより、A []とI []の両方を並べ替えます。各ストアは適切な場所に値を配置するため、時間計算量はO(n)です。

    // reorder A in place according to sorted indices in I
    // tA is temp value for A
    for(i = 0; i < n; i++){
        if(i != I[i]){
            tA = A[i];
            k = i;
            while(i != (j = I[k])){
                A[k] = A[j];
                I[k] = k;
                k = j;
            }
            A[k] = tA;
            I[k] = k;
        }
    }

Cを使用していることに気づきました。C++では、ラムダ比較関数を使用して、I []のインデックスに基づいてA []のメンバーを比較できます。Cの場合、インデックスI []の配列の代わりにポインタの配列P []を使用できます。

    /* create array of pointers to A[] */
    for(i = 0; i < n; i++)
        P[i] = &A[i];
    /* sort array of pointers, compare is custom compare function */
    qsort(P, n, sizeof(P[0]), compare);
    /* reorder A[] according to the array of pointers */
    for(i = 0; i < n; i++){
        if(i != P[i]-a){
            tA = A[i];
            k = i;
            while(i != (j = P[k]-a)){
                A[k] = A[j];
                P[k] = &A[k];
                k = j;
            }
            A[k] = tA;
            P[k] = &A[k];
        }
    }

A []に整数が含まれている場合の、qsort()のカスタム比較の例。qsort()はcompare()へのパラメーターとしてP []へのポインターを渡し、P []はポインターの配列であるため、compare()に渡されるパラメーターはポインターへのポインターです。

int compare(const void *pp0, const void *pp1)
{
    return( (**(int **)pp0) - (**(int **)pp1) );
}

目標がA []の並べ替えに基づいて、2番目の配列B []を並べ替えることである場合は、次のような行を追加します。

        /* ... just after tA = A[i] */
        tB = B[i];
            /* ... just after A[k] = A[j] */
            B[k] = B[j];
        /* ... just after A[k] = tA */
        B[k] = tB;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

PHPは、別の配列で定義された順序に従って配列を並べ替えます

分類Dev

CUDA:推力を使用して別の配列で定義された順序に従って配列を並べ替えます

分類Dev

順序付けられた配列パターンに従ってbash配列を並べ替えます

分類Dev

ネストされたJSON配列を所定の位置に並べ替えます

分類Dev

PHPの値に従って配列を並べ替えます

分類Dev

別の配列の並べ替え順序に基づいて複数の配列を並べ替えるにはどうすればよいですか?

分類Dev

JavaScriptで別の配列に従って配列を並べ替えたいですか?

分類Dev

別の配列に基づいて複数の配列を並べ替える並べ替え順序

分類Dev

別の配列の並べ替え順序に基づいて配列を並べ替える

分類Dev

値のカスタム並べ替えを定義し、その並べ替えに従って配列から最大値と最小値を取得する-PHP

分類Dev

最初の配列に従って配列を並べ替える

分類Dev

javascriptの別の配列に従って配列を並べ替える方法は?

分類Dev

別の配列の順序で配列を並べ替える

分類Dev

Swiftの与えられたインデックスに従って配列を並べ替えます

分類Dev

配列の並べ替え:最初に定義された順序で1つの要素で、次に他の2つの要素の合計で

分類Dev

Python-指定された属性の順序に従ってオブジェクトの配列を二重に並べ替える方法は?

分類Dev

javaScriptで指定されたインデックスに従って配列を並べ替えます

分類Dev

子配列の数に従って配列の配列を並べ替える

分類Dev

事前定義された配列に従って配列(結果セット)を並べ替える

分類Dev

事前定義された順序に基づいてJavascriptで配列を並べ替える

分類Dev

別の配列で指定された特定の順序で配列値を並べ替える

分類Dev

大きな行列を並べ替えるか、列ペアの値によって決定される特定の順序で行を抽出します

分類Dev

別の配列の順序に基づいて配列の配列を並べ替える(Ruby)

分類Dev

別の配列の順序に基づいて配列の配列を並べ替える

分類Dev

配列から元のデータを削除せずに、指定されたユーザーIDに従って配列を並べ替えます

分類Dev

オブジェクトの配列を取得し、アルファベット順に並べ替えられた小さな配列に並べ替えます

分類Dev

定義された行のブロックで列を昇順および降順で並べ替えます

分類Dev

配列に入力された並べ替え順序からhtmlを並べ替える

分類Dev

値による順序での配列の並べ替え

Related 関連記事

  1. 1

    PHPは、別の配列で定義された順序に従って配列を並べ替えます

  2. 2

    CUDA:推力を使用して別の配列で定義された順序に従って配列を並べ替えます

  3. 3

    順序付けられた配列パターンに従ってbash配列を並べ替えます

  4. 4

    ネストされたJSON配列を所定の位置に並べ替えます

  5. 5

    PHPの値に従って配列を並べ替えます

  6. 6

    別の配列の並べ替え順序に基づいて複数の配列を並べ替えるにはどうすればよいですか?

  7. 7

    JavaScriptで別の配列に従って配列を並べ替えたいですか?

  8. 8

    別の配列に基づいて複数の配列を並べ替える並べ替え順序

  9. 9

    別の配列の並べ替え順序に基づいて配列を並べ替える

  10. 10

    値のカスタム並べ替えを定義し、その並べ替えに従って配列から最大値と最小値を取得する-PHP

  11. 11

    最初の配列に従って配列を並べ替える

  12. 12

    javascriptの別の配列に従って配列を並べ替える方法は?

  13. 13

    別の配列の順序で配列を並べ替える

  14. 14

    Swiftの与えられたインデックスに従って配列を並べ替えます

  15. 15

    配列の並べ替え:最初に定義された順序で1つの要素で、次に他の2つの要素の合計で

  16. 16

    Python-指定された属性の順序に従ってオブジェクトの配列を二重に並べ替える方法は?

  17. 17

    javaScriptで指定されたインデックスに従って配列を並べ替えます

  18. 18

    子配列の数に従って配列の配列を並べ替える

  19. 19

    事前定義された配列に従って配列(結果セット)を並べ替える

  20. 20

    事前定義された順序に基づいてJavascriptで配列を並べ替える

  21. 21

    別の配列で指定された特定の順序で配列値を並べ替える

  22. 22

    大きな行列を並べ替えるか、列ペアの値によって決定される特定の順序で行を抽出します

  23. 23

    別の配列の順序に基づいて配列の配列を並べ替える(Ruby)

  24. 24

    別の配列の順序に基づいて配列の配列を並べ替える

  25. 25

    配列から元のデータを削除せずに、指定されたユーザーIDに従って配列を並べ替えます

  26. 26

    オブジェクトの配列を取得し、アルファベット順に並べ替えられた小さな配列に並べ替えます

  27. 27

    定義された行のブロックで列を昇順および降順で並べ替えます

  28. 28

    配列に入力された並べ替え順序からhtmlを並べ替える

  29. 29

    値による順序での配列の並べ替え

ホットタグ

アーカイブ