【问题标题】:Is there a sorting algorithm with a worst case time complexity of n^3?是否有最坏情况时间复杂度为 n^3 的排序算法?
【发布时间】:2014-12-09 21:38:50
【问题描述】:

我熟悉其他排序算法,在多项式时间内我听说过的最糟糕的是插入排序或冒泡排序。排除真正可怕的 bogosort 之类的,有没有多项式时间复杂度比 n^2 更差的排序算法?

【问题讨论】:

  • 我能想出一个,为什么不呢?只需取 n^2 一个,然后迭代 n 次。
  • 如果您愿意,我可以为您写一个,价格非常合理。但是你为什么想要一个?
  • 看看 Bogosort :)
  • 当然——快速排序后跟三个从 1 到 N 的嵌套循环(执行恒定时间无操作)。
  • “排除真正可怕的”有点难。由于最简单的解决方案是O(n²),因此比这更糟糕的一切都将非常糟糕。

标签: algorithm sorting time-complexity


【解决方案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;
    }
}

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

要点是这样的:

  • 对于每个索引
    • 从该点向前查找元素
      • 与它之后的所有其他元素相比,最终是
    • 用这个索引处的元素交换这个最短的元素

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

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

【讨论】:

  • @Flumpson:如果这回答了您的问题,请将其标记为答案,以便人们知道您不是仍在寻找答案。
【解决方案2】:

这是一个名为 slowsort 的优雅算法示例,它在 Ω(n^(log(n )/(2+ɛ))) 对于任何正的ɛ:

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

【讨论】:

  • 哇。我喜欢那张纸。不幸的是,我在 Bentley 的 Programming Perls 和 Steele 的术语文件中都找不到他们引用的“聪明的 O(n³) 排序例程”。可以吗?
  • @Bergi 不。如果你找到了,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多