6

float[]ソートする必要があります。そして、古いインデックスが新しい配列のどこにあるかを知る必要があります。だから使えない、Array.Sort();とか。したがって、配列をソートし、各値をどのインデックスから取得したかを記憶する関数を作成したいと思います。

float[] input  = new float[] {1.5, 2, 0, 0.4, -1, 96, -56, 8, -45};
// sort
float[] output; // {-56, -45, -1, 0, 0.4, 1.5, 2, 8, 96};
int[] indices; // {6, 8, 4, 2, 3, 0, 1, 7, 5};

配列のサイズは約 500 になります。これにどのようにアプローチすればよいですか? ソートアルゴリズムなど


解決後: C# の強力さにいつも驚かされます。それだけでそのタスクを実行できるとは思っていませんでした。Array.Sort()そして、私はそれが非常に速いとすでに聞いているので、私はそれを取ります。

4

5 に答える 5

13
float[] input = new float[] { 1.5F, 2, 0, 0.4F, -1, 96, -56, 8, -45 };
int[] indices = new int[input.Length];
for (int i = 0; i < indices.Length; i++) indices[i] = i;
Array.Sort(input, indices);
// input and indices are now at the desired exit state

基本的に、2 引数バージョンのは両方のArray.Sort配列に同じ操作を適用し、最初の配列で実際の並べ替え比較を実行します。これは通常、逆に使用されます。目的のインデックスで何かを再配置します。しかし、これも機能します。

于 2013-07-01T08:14:43.667 に答える
5

Array.Sort() のオーバーロードを使用できます。これは 2 つの配列を取り、最初の配列の並べ替え方法に従って 2 番目の配列を並べ替えます。

float[] input  = new [] { 1.5f, 2, 0, 0.4f, -1, 96, -56, 8, -45 };
int[] indices = Enumerable.Range(0, input.Length).ToArray();
Array.Sort(input, indices);
于 2013-07-01T08:14:15.073 に答える
4

インデックスの新しい配列を作成し、Array.Sort を使用して両方を並べ替え、inputキーとして扱うことができます。

float[] input = new float[] { 1.5F, 2, 0, 0.4F, -1, 96, -56, 8, -45 };
int[] indicies = Enumerable.Range(0, input.Length).ToArray();
Array.Sort(input, indicies);
于 2013-07-01T08:14:24.303 に答える
0

linq を使用する場合:

    float[] input = new float[] { 1.5F, 2, 0, 0.4F, -1, 96, -56, 8, -45 };

    var result = input.Select(x => new { Value = x, Index = input.ToList().IndexOf(x)}).OrderBy(x => x.Value).ToList();

    // sort
    float[] output = result.Select(x => x.Value).ToArray();
    int[] indices = result.Select(x => x.Index).ToArray();

結果では、値とそのインデックスを持つオブジェクトが得られました。

于 2013-07-01T08:19:52.923 に答える