是否存在最差情况时间复杂度为n ^ 3的排序算法?

时间:2014-12-09 21:38:50

标签: algorithm sorting time-complexity

我熟悉其他排序算法,而我在多项式时间内听到的最糟糕的是插入排序或冒泡排序。排除真正可怕的bogosort和类似的那些,是否有任何排序算法的多项式时间复杂度比n ^ 2更差?

2 个答案:

答案 0 :(得分:2)

以下是名为 slowsort 的优雅算法示例,该算法在Ω中运行( n ^(log( n )/(2+ ɛ)))对于任何积极的ɛ

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.116.9158&rep=rep1&type=pdf(第5条)。

答案 1 :(得分:1)

这是一个用C#实现的:

public void BadSort<T>(T[] arr) where T : IComparable
{
    for (int i = 0; i < arr.Length; i++)
    {
        var shortest = i;
        for (int j = i; j < arr.Length; j++)
        {
            bool isShortest = true;
            for (int k = j + 1; k < arr.Length; k++)
            {
                if (arr[j].CompareTo(arr[k]) > 0)
                {
                    isShortest = false;
                    break;
                }
            }
            if(isShortest)
            {
                shortest = j;
                break;
            }
        }
        var tmp = arr[i];
        arr[i] = arr[shortest];
        arr[shortest] = tmp;
    }
}

它基本上是一种非常天真的排序算法,再加上一种用不必要的复杂方法计算最小值的索引。

要点是:

  • 对于每个索引
    • 从这一点向前找到元素
      • 与其后的所有其他元素进行比较时,最终为&lt; =所有元素。
    • 将此最短元素与此索引处的元素交换

最坏的情况(带有比较)将在最坏的情况下执行O(n^3)次(降序排序的输入),外循环的每次迭代都会将一个元素放到正确的位置,让你只是更接近完全排序。

如果你努力工作,你可能会找到一个几乎任何你想要的复杂度的排序算法。但是,正如评论者指出的那样,没有理由寻找一个像这样的最坏情况的算法。你希望永远不会陷入野外。你真的必须尝试来想出一个这么糟糕的事情。