別の配列の値を取り、それらのサイズに基づいて別の配列に「ソート」する配列を作成しようとしています。
例:
[16, 5, 23, 1, 19] の配列
として2番目の配列になります
[2、1、4、0、3]
最初の配列は任意のサイズにすることができますが、重複する数値が含まれていないと見なされます。配列内の位置を維持することが重要です。
これは、2 つの配列を取り、最初の配列をソートする順序に従って 2 番目の配列をソートするオーバーロードをArray.Sort()
使用して行うことができます。
var array = new[] { 16, 5, 23, 1, 19 };
var indices = Enumerable.Range(0, array.Length).ToArray();
Array.Sort(array.ToArray(), indices);
var result = new int[array.Length];
for (int i = 0; i < result.Length; ++i)
result[indices[i]] = i;
// Now result[] contains the answer.
これは、いくつかのO(n)
操作を使用して配列のコピーを作成indices
し、最初に配列を作成し、続いてO(n log n)
並べ替えを行い、最後O(n)
に再配置する操作で終了しresult[]
ます。
(他の回答に示されているアルゴリズムは少し遅い可能性がありますが、この機能が最大速度を必要とすることを既に決定していない限り、おそらく気にしないでしょう。これはありそうもないことです。)