排序整数

时间:2014-09-09 23:18:20

标签: algorithm sorting

我是算法的艺术和科学的初学者,而且我正在学习"快速排序" (据说速度很快)我有一个使用字典的想法。我把它编码了,我感到非常惊讶的是,对于我感兴趣的东西(排序,比如地球温度或高程数据)我编码的实际上比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;
}

1 个答案:

答案 0 :(得分:3)

您已经重新发现了维基百科称之为counting sort的内容,这是一种非常简单的分发排序算法。它是数据集的最佳算法:它在O(N + k)时间内运行(N是记录数,k是不同键的数量),使用O(k)附加存储,并且具有非常低的系数。 / p>