按降序对数组进行排序的更好方法
Posted
技术标签:
【中文标题】按降序对数组进行排序的更好方法【英文标题】:Better way to sort array in descending order 【发布时间】:2011-07-22 17:58:09 【问题描述】:我有一个 int 数组,我必须按降序排序。
由于我没有找到任何按降序对数组进行排序的方法。目前我正在按如下所示对数组进行降序排序
int[] array = new int[] 3, 1, 4, 5, 2 ;
Array.Sort<int>( array );
Array.Reverse( array );
现在的问题是。在 c# 中有没有更好的方法来做同样的事情?
【问题讨论】:
如果对时间没有太大的限制,我会坚持使用 Array.Sort,然后使用 Array.Reverse。原因是可读性非常高,并且渐近地,Array.Reverse() 只是一个 O(n) 操作。 【参考方案1】:使用 LINQ OrderByDescending
方法。它返回IOrderedIEnumerable<int>
,如果需要,您可以将其转换回数组。一般来说,List<>
s 比Array
s 更实用。
array = array.OrderByDescending(c => c).ToArray();
【讨论】:
这是一个简短的工作代码,但是如果数组很大,效率不是很高(在性能方面),因为数组先转换为列表,然后排序,最后转换为数组.我错了吗? @Ilyusha,如果从复合对象(不是简单对象)的角度考虑int
,那么int
与其他对象一样,因为您需要比较两个对象中的任何一个直到第一个差异,所以 O(n) 这是不可能的结果。
@Ilyusha,好的,好的,好的。你说得对。 +1,感谢您的解释。
@Ilyusha 的谷歌翻译(我仍然不完全理解):整数可以按 O (n) 排序。有一个非常底层的视图,由一个位序列表示的数字。然后,从技术上讲,比较两个数字比读取其中两个数字需要更少的资源。这表明了一种不同寻常的存储和比较方式,因此 sisyarpe 对此毫无疑问。
@JYL 你没看错。 OrderBy()
是与 Array.Sort()
不同的算法。有兴趣的可以看这个帖子***.com/questions/1832684/…【参考方案2】:
根据排序顺序,您可以这样做:
int[] array = new int[] 3, 1, 4, 5, 2 ;
Array.Sort<int>(array,
new Comparison<int>(
(i1, i2) => i2.CompareTo(i1)
));
...或者这个:
int[] array = new int[] 3, 1, 4, 5, 2 ;
Array.Sort<int>(array,
new Comparison<int>(
(i1, i2) => i1.CompareTo(i2)
));
i1 和 i2 刚好相反。
【讨论】:
这个,或者只是在CompareTo
之前添加一个-
(减号)
或者简单地 Array.Sort(array, (a, b) => b.CompareTo(a))
进行反向排序。
是的,但有时速度较慢……所以这取决于您想要什么以及您的排序,请参阅:***.com/questions/6842090/…
或者这样做:'Array.Sort当然,您可以自定义排序。
你需要给 Sort() 一个委托给它用来排序的比较方法。
使用匿名方法:
Array.Sort<int>( array,
delegate(int a, int b)
return b - a; //Normal compare is a-b
);
了解更多信息:
Sorting arraysMSDN - Array.Sort Method (T[], Comparison)
【讨论】:
记住,当 b 是 int.MinValue 并且 a 是任何正数时,你可能会得到 b - a 的整数溢出。最好总是做 b.CompareTo(a)【参考方案4】:就地降序排序:
int[] numbers = 1, 2, 3 ;
Array.Sort(numbers, (a, b) => b.CompareTo(a));
对于异地排序(输入数组没有变化):
int[] numbers = 1, 2, 3 ;
var sortedNumbers = numbers.OrderByDescending(x => x).ToArray();
【讨论】:
记住,当 b 是 int.MinValue 并且 a 是任何正数时,你可能会得到 b - a 的整数溢出。最好总是这样做 b.CompareTo(a)【参考方案5】:是的,您可以将谓词传递给排序。那将是您的反向实现。
【讨论】:
【参考方案6】:您可以在Array.Sort中指定一个比较器(IComparer实现)作为参数,排序顺序实际上取决于比较器。默认比较器用于升序排序
【讨论】:
【参考方案7】:class Program
private static int[] table;
static void Main(string[] args)
int[] ints = new int[] 6, 2, 5, 99, 55 ;
table = ints.OrderByDescending(x => x).ToArray();
foreach (var item in table)
Console.WriteLine(item);
【讨论】:
以上是关于按降序对数组进行排序的更好方法的主要内容,如果未能解决你的问题,请参考以下文章