1

正の値と負の値を持つn=32個のアイテムの配列があります。最初のn/2要素は正で値でソートされ、2番目のn/2要素も負で値でソートされます。最小の負の値から最大の正の値まで、配列全体を値で並べ替えたいと思います。つまり、32個の要素がある場合、最初の16(n / 2)個の並べ替えられた要素には、元の配列の2番目の16個の要素の値が含まれている必要があります。ソートされた配列の次の16個の要素には、元の配列の最初の16個の値が含まれている必要があります。

架空の例:

double[] original = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -16, -15, ..., -1};

double[] sorted = {-16, -15, ...., -1, 1, 2, ..., 16};

誰かが要素をシフトして元の配列からソートされた配列を生成するための最良の方法を知っていますか?

ちなみに、この配列は、同じ方法でサイズで並べ替えられた要素を持たない別の配列に関連付けられており、元の配列と同じようにシフトする必要があるため、配列をサイズで並べ替えないでください。シフトする必要があります。

4

7 に答える 7

9

それで、元の内容であるが位置がシフトされた2番目の配列が必要ですか?明示的に行うか、次のようにします。

double[] result = new double[32];
for (int i=0; i < 32; i++)
{
    result[(i+16)%32] = original[i];
}

またはArray.Copy2回使用する:

double[] result = new double[32];
Array.Copy(original, 0, result, 16, 16);
Array.Copy(original, 16, result, 0, 16);
于 2009-04-19T18:44:52.580 に答える
3

問題の厳格な性質を考えると、Array.Copy

        int half = original.Length / 2;
        Array.Copy(original, 0, sorted, half, half);
        Array.Copy(original, half, sorted, 0, half);
于 2009-04-19T19:07:19.343 に答える
2

Linqではどうですか?

int half = original.Length/2;
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray();
于 2009-04-19T18:58:08.413 に答える
0

要素0と要素16、1と17、2と18などをスワップするだけです。

于 2009-04-19T18:38:06.793 に答える
0

やってみました:

Array.Sort(original);
于 2009-04-19T18:40:43.590 に答える
0

同じサイズの別の配列に含まれる値に基づいて1つの配列を並べ替えますか?その場合は、以下を使用してください。

Array.Sort(keys, values);

これがドキュメントですArray.Sort(配列キー、配列アイテム)

于 2009-04-19T19:02:19.340 に答える
0

JonSkeetとMarcGravell♦の回答は正しい解決策を提供しますが、余分な配列を割り当てたくない場合は、次のことができます。

a)特定の問題を解決します(後半を前半の前にシフトします)。

private void Rotate1(double[] toRotate ) {
        int startOf2nd = toRotate.Length / 2;
        for (int i=0; i < toRotate.Length/2; i++) {
            double temp = toRotate [i];
            toRotate [i] = toRotate [i + startOf2nd];
            toRotate [i + startOf2nd] = temp;
        }
    }

このコードは、アイテム数が奇数の配列を処理できないことに注意してください。

b)JonBentleyの「ProgrammingPearls」から私が知っているベクトルシフトアルゴリズムを適用できます。

 private void Rotate2(double[] toRotate, int index ) {
        Array.Reverse(toRotate, 0, index);
        Array.Reverse(toRotate, index, toRotate.Length-index);
        Array.Reverse(toRotate, 0, toRotate.Length);
    }

この例では、インデックスは16になります。このコードは、奇数のアイテムとインデックスが中央にないことを処理します。toRotate={0,1,2,3,4,5,6,7}およびindex=3の本で使用されているものと同様の例を使用すると、Rotate2は{3,4,5,6,7,0を生成します。 、1,2}。

于 2013-04-17T16:04:23.987 に答える