这是一种已知的排序算法吗?

时间:2015-04-26 22:52:42

标签: algorithm sorting

我正在做一些练习并实现了一些众所周知的顺序算法,我认为如果我们侧面查看列表它应该看起来排序而不做任何工作(参见代码,它非常自我解释)。很确定它已经考虑过/已完成,我想知道它实际上叫什么。

这就是我实现它的方式。而且我知道当内容" max-min"范围很大,而且可能只对整数有效。 (但它看起来非常好用于非常大的列表,其内容来自一个小范围(我的PC上的变化少于110000000(mem开始说不)

获得此名称的主要原因是要考虑进一步的改进和变化:

void MainWindow(){
    for (int a = 0; a < 130000000; a++)
    {
        rList.Add(rand.Next(1, 110000000));
    }
    Thread t1 = new Thread(() =>
    {
        SortYAxis(rList);
    });
}

void SortYAxis(List<int> list)
{
    int max = int.MinValue;
    int min = int.MaxValue;
    foreach (int a in list)//Get max/min range
    {
        if (max < a)
        {
            max = a;
        }
        else if (min > a)
        {
            min = a;
        }
    }

    int[] yList = new int[max - min + 1];
    foreach (int a in list)//Flatten along Y axis
    {
        yList[a - min]++;
    }

    for (int i = 0, a = 0; i < yList.Length; i++)//Read down Y axis
    {
        while (yList[i] != 0)
        {
            list[a++] = i + min;
            yList[i]--;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

这是Bucket Sort。 (您的代码几乎就是教科书的实现。)

Bucket sort的效率来自于它不是comparison sort这一事实 - 数组的元素没有相互比较。这就是桶排序可以具有O(n)复杂度,以及&#34; beat&#34;比较排序约束的标准O(n log(n))限制。

缺点(如你所推测的)是铲斗排序仅适用于有限集,即必须有一些有限数量的桶#34;可以创建以保存任何要排序的元素。因此,bucket sort不能用作浮点值或字符串的排序算法。此外,如果&#34;范围&#34;那么铲斗分类具有很高的空间要求。价值很大。这些因素往往超过线性复杂性的好处,因此铲斗排序往往不会被大量使用。