有您測試代碼,以確定基於LINQ的排序是在你的程序中的瓶頸? LINQ的排序非常快。例如,下面的代碼對包含1,000到10,000個項目的字典進行排序。平均超過1,000次運行的時間大約爲3.5毫秒。
static void DoIt()
{
int NumberOfTests = 1000;
Random rnd = new Random();
TimeSpan totalTime = TimeSpan.Zero;
for (int i = 0; i < NumberOfTests; ++i)
{
// fill the dictionary
int DictionarySize = rnd.Next(1000, 10000);
var dict = new Dictionary<int, string>();
while (dict.Count < DictionarySize)
{
int key = rnd.Next(1000000, 9999999);
if (!dict.ContainsKey(key))
{
dict.Add(key, "x");
}
}
// Okay, sort
var sw = Stopwatch.StartNew();
var sorted = (from kvp in dict
orderby kvp.Key
select kvp).ToList();
sw.Stop();
totalTime += sw.Elapsed;
Console.WriteLine("{0:N0} items in {1:N6} ms", dict.Count, sw.Elapsed.TotalMilliseconds);
}
Console.WriteLine("Total time = {0:N6} ms", totalTime.TotalMilliseconds);
Console.WriteLine("Average time = {0:N6} ms", totalTime.TotalMilliseconds/NumberOfTests);
請注意,報告的平均值包括JIT時間(第一次通過循環,大約需要35 ms)。
鑑於一個好的基數排序實現可能會提高排序性能,我懷疑你的優化工作會更好地花在其他地方。
使用您找到的數組實現之一併保留兩個數組:一個使用鍵,一個使用值。修改實現,以便對鍵數組進行排序,並且每當進行修改時,都會對values數組進行相同的修改。 – dtb
是的,我已經有了一個類似的想法,也有兩個列表。但我認爲管理兩個列表會破壞快速基數排序的優勢,因爲這種差異對QuickSort來說不夠大。 – Rene