按降序对数组进行排序的更好方法

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&lt;int&gt;,如果需要,您可以将其转换回数组。一般来说,List&lt;&gt;s 比Arrays 更实用。

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) =&gt; b.CompareTo(a)) 进行反向排序。 是的,但有时速度较慢……所以这取决于您想要什么以及您的排序,请参阅:***.com/questions/6842090/… 或者这样做:'Array.Sort(array, (i1,i2) => i2.CompareTo(i1))'【参考方案3】:

当然,您可以自定义排序。

你需要给 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);
        

    

【讨论】:

以上是关于按降序对数组进行排序的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

按降序对int数组进行排序[重复]

如何在Ruby中按降序对数组进行排序

有效地按降序对numpy数组进行排序?

如何按降序对 JSON 数组元素进行排序? [复制]

如何根据特定值按降序对数组进行排序[重复]

如何按降序对 ListView.builder 进行排序?