2013-09-28 27 views
0

我正在看编写一个数组,它接受另一个数组的值,并根据它们的大小将它们“排序”到另一个数组中。用另一个数组的数字顺序制作一个数组

实施例:

的阵列[16,5,23,1,19]

将所述第二阵列中的最后成为

[2,1,4,0,3 ]

第一个数组可以是任意大小,但假定其中没有任何重复数字。它不应该按照最大到最大的顺序排列数字,在阵列中保持位置至关重要。

+2

怎么回事要根据尺寸进行排序。我不知道'[16,5,23,1,19]'会如何结束为[2,1,4,0​​,3]' – 2013-09-28 07:25:48

+0

16是第三大数字,5是第二大数字,23是总体最大,1是最小的,19是第四大的。 – user2825792

+1

您不是按常规字符串或数字排序,而是尝试根据自己的业务逻辑进行排序,您可以覆盖对象的CompareTo或Equalto函数,然后使用该函数根据该逻辑对数组进行排序。 –

回答

4

幼稚的做法:

var array = new []{16, 5, 23, 1, 19}; 

var sortedArray = array.OrderBy(x=>x).ToArray(); 

var result = new int[array.Length]; 

for(int i = 0; i<result.Length; i++) 
    result[i] = Array.IndexOf(sortedArray, array[i]); 
0
var result = origArray.Select(Tuple.Create<int, int>) 
    .OrderBy(t => t.Item1) 
    .Select((t, x) => Tuple.Create(t.Item2, x)) 
    .OrderBy(s => s.Item1) 
    .Select(s => s.Item2) 
    .ToArray(); 

未经检验的,所以可能需要一些调整,但这个想法应该没问题。

0

您可以使用the overload of 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[]

(在其他答案提出的算法可能会慢一点,但你可能真的不在乎,除非你已经确定此功能要求最高要求的速度 - 这似乎不太可能)

相关问题