簡體   English   中英

以降序排序數組的最快方法

[英]Fastest way to sort an array in descending order

為什么是以下代碼

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>(T[] array, int index, int length, IComparer<T> 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<T>.Default || !Array.TrySZSort((Array) array, (Array) null, index, index + length - 1)))
    ArraySortHelper<T>.Default.Sort(array, index, length, comparer);
}

正如鏈接指出的那樣

這里的排序方法總是在內部的TrySZSort或QuickSort方法中結束,因為它不會拋出異常。 TrySZSort內部方法針對一維數組進行了優化,也稱為“零”數組或向量

因為基類庫中使用的TrySZSort方法是在本機代碼中實現的,所以它已經過大量優化。 因此,這種方法可能比用C#語言編寫的任何解決方案都要快

代表們。

對委托的調用比對IComparable.CompareTo的默認調用慢得多

更新:

如果您想要相同(或接近)的速度,請實現IComparer接口並將其傳遞給sort方法。

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

因為在你的第二個版本中,它必須在每次進行比較時調用你的(匿名)函數,然后在其中調用.CompareTo,因此你有兩個間接,否則它可以使用內置比較(對於基本類型)。

基本上你支付函數調用開銷,我打賭在執行這些操作時會刪除本機原始類型。 雖然技術上可行(我認為),但我懷疑Jitter能否在第二種情況下完全內聯它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM