我是算法的艺术和科学的初学者,而且我正在学习"快速排序" (据说速度很快)我有一个使用字典的想法。我把它编码了,我感到非常惊讶的是,对于我感兴趣的东西(排序,比如地球温度或高程数据)我编码的实际上比C#.NET更快 ; s List.Sort()一旦我在发布模式下编译它。例如,如果我创建一个包含值为0到8000(典型地球高程的良好范围)的一百万个整数的列表,则.NET List.Sort()方法平均大约88毫秒来对列表进行排序,而以下算法在大约58毫秒内完成。 所以这让我觉得我要么应该获得诺贝尔计算机科学奖(不太可能),要么就是我缺少一些东西,并且有一种更有效的方法来排序范围内的大量整数说从零到10,000。专家如何对该范围内的大量数据进行排序?
private static long DictionarySort(List<int> myList, out List<int> sortedList)
{
Stopwatch sw = new Stopwatch();
sw.Start();
int max = myList.Max();
Dictionary<int, int> sorter = new Dictionary<int, int>();
int myListCount = myList.Count;
for (int i = 0; i < myListCount; i++)
{
int val = myList[i];
int occurances = 0;
sorter[val] = sorter.TryGetValue(val, out occurances) ? occurances + 1 : 1;
}
sortedList = new List<int>(myList.Count + 1);
int numOccur = 0;
for (int i = 0; i <= max; i++)
{
if (sorter.TryGetValue(i, out numOccur))
{
for (int j = 0; j < numOccur; j++)
{
sortedList.Add(i);
}
}
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
答案 0 :(得分:3)
您已经重新发现了维基百科称之为counting sort的内容,这是一种非常简单的分发排序算法。它是数据集的最佳算法:它在O(N + k)时间内运行(N是记录数,k是不同键的数量),使用O(k)附加存储,并且具有非常低的系数。 / p>