以降序排序数组的最快方法

为什么是以下代码

Array.Sort(values); Array.Reverse(values); 

与以下相比,按降序排序数组要快得多

 Array.Sort(values, (a,b)=>(-a.CompareTo(b))); 

代码在调试器外部的发布模式下运行。

对数组进行降序排序的最有效方法是什么,最好是在一个内衬中?

这是一个很好的问题。 我打赌你的values数组是一个原始类型的数组!

它实际上是这里的主导,因为Reverse的复杂性是O(n),而排序是O(n logn)。

问题在于,在对基本类型进行排序时,.NET实际上会调用本机函数,这非常快 – 比使用比较或比较器快得多。

该函数名为TrySZSort

 [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)] [SecurityCritical] [MethodImpl(MethodImplOptions.InternalCall)] private static bool TrySZSort(Array keys, Array items, int left, int right); 

以下是它在Array类中的调用方式:

 [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)] [SecuritySafeCritical] public static void Sort(T[] array, int index, int length, IComparer comparer) { if (array == null) throw new ArgumentNullException("array"); else if (index < 0 || length < 0) throw new ArgumentOutOfRangeException(length < 0 ? "length" : "index", Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); else if (array.Length - index < length) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidOffLen")); else if (length > 1 && (comparer != null && comparer != Comparer.Default || !Array.TrySZSort((Array) array, (Array) null, index, index + length - 1))) ArraySortHelper.Default.Sort(array, index, length, comparer); } 

正如链接指出的那样

此处的排序方法在不引发exception时始终以内部TrySZSort或QuickSort方法结束。 TrySZSort内部方法针对一维数组进行了优化,也称为“零”数组或向量

因为基类库中使用的TrySZSort方法是在本机代码中实现的,所以它已经过大量优化。 因此,这种方法可能比用C#语言编写的任何解决方案都要快

代表们。

对委托的调用比对IComparable.CompareTo的默认调用要慢得多

更新:

如果您想要相同(或接近)的速度,请实现IComparer接口并将其传递给sort方法。

http://msdn.microsoft.com/en-us/library/bzw8611x

因为在你的第二个版本中,它必须在每次进行比较时调用你的(匿名)函数,然后在其中调用.CompareTo,因此你有两个间接,否则它可以使用内置比较(对于基本类型)。

基本上你支付函数调用开销,我打赌在执行这些操作时会删除本机原始类型。 虽然技术上可行(我认为),但我怀疑Jitter是否能够在第二种情况下完全内联它们。