2009-04-19 13 views
1

私は、正と負の値を持つn = 32の要素の配列を持っています。最初のn/2要素は正の値でソートされ、2番目のn/2要素は負で値によってソートされます。最小の負の値から最大の正の値まで配列全体を値でソートしたいと思います。つまり、32個の要素がある場合、最初の16(n/2)のソートされた要素に元の配列の2番目の16要素ソートされた配列の2番目の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}; 

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

この配列は、同じ方法でサイズによってソートされた要素を持たない別の配列に結び付けられているため、配列をサイズでソートしないように元の配列と同じ方法で移動する必要があります。をシフトさせる必要があります。

+0

シフトされていてソートされていないのはなぜですか? –

+0

私はこの方法で同じ方法でサイズでソートされていない別の配列をシフトする必要があるためです。仮想関数の例はx軸を表し、サイズでソートされますが、別の配列にはサイズ(y軸)でソートしてはいけない値が含まれています。 –

+0

別の配列に含まれる値に基づいて1つの配列をソートしますか?言い換えれば、あるアレイをソートして、同じシーケンスのシーケンスを別のアレイに適用したいですか? –

答えて

9

をしてあなたは、二番目の配列をしたいです元の内容は変わったのですが?明示的にそれを実行します。

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

や二度Array.Copyを使用して:

double[] result = new double[32]; 
Array.Copy(original, 0, result, 16, 16); 
Array.Copy(original, 16, result, 0, 16); 
0

だけなど...、要素0および要素16上のスワップを行う1および17、2、18

0

あなたは試してみました:

Array.Sort(original); 
+0

それはソートされていないシフトされる必要があります! –

+0

与えた例では、Array.Sortを使用して目的の結果が得られます。 –

+0

両方の半分が既に(あなたの説明に従って)ソートされていることに留意して、要素16をシフトする16,1および17,2および19などは、サイズによって配列をソートするのと同じ結果になります。 –

2

どの程度のLINQで:

int half = original.Length/2; 
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray(); 
+2

私は、連合よりもむしろ連合 - 連合が繰り返される要素を削除することを意味すると思います。 –

+0

@ジョン:ありがと...私はあなたの提案された変更を行いました。 – Keltex

0

は、あなたが他のに含まれている値に基づいて1つの配列をソートしたいですか同じサイズの配列?その場合は、次のようにします。ここでは、問題の剛性の性質を考えるドキュメントArray.Sort(Array keys, Array items)

3

Array.Sort(keys, values); 

Array.Copy

 int half = original.Length/2; 
     Array.Copy(original, 0, sorted, half, half); 
     Array.Copy(original, half, sorted, 0, half); 
0

ジョンスキートのとマルクGravell♦さんの答えは提供正しい解決方法を見つけることができますが、余分な配列を割り当てたくない場合は、

)問題を解決してください

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)あなたは、私はジョン・ベントレーの「プログラミングの真珠」から知っているベクトルシフトアルゴリズム適用することができます。インデックスは16になり、あなたの例では

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); 
    } 

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

関連する問題