【问题标题】: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) 操作。

标签: c# linq sorting


【解决方案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() 不同的算法。有兴趣的可以看这个帖子stackoverflow.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)) 进行反向排序。
  • 是的,但有时速度较慢……所以这取决于您想要什么以及您的排序,请参阅:stackoverflow.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 arrays
MSDN - 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);
              }
      
          }
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 2014-02-16
        • 2013-09-20
        • 1970-01-01
        • 2011-02-09
        • 2021-12-28
        • 1970-01-01
        • 2012-07-15
        • 2021-11-19
        相关资源
        最近更新 更多