【问题标题】:Which sorting algorithm should be used that runs in O(n)?应该使用在 O(n) 中运行的哪种排序算法?
【发布时间】:2014-11-29 20:23:26
【问题描述】:

我很难确定哪种算法最适合某些规范。

提示如下:

编写一个算法对 n 个整数进行排序,每个整数都在范围内 [0..((n^4)-1)] 在 O(n) 时间内。

我更像是一个视觉学习者,并且通过示例最能理解。我为此设定了值以将其可视化,但我不知道要使用哪种排序方法或如何确定使用哪种排序方法。非常感谢任何提示或建议。谢谢!

【问题讨论】:

  • 冒泡排序和插入排序不会在 O(n) 中运行(特殊情况除外)
  • 阅读基数排序。你可以用你选择的基础做一个技巧。据我所知,这是唯一的方法。

标签: algorithm sorting big-o


【解决方案1】:

正如我在评论中所说,据我所知,唯一的方法是radix sort。您基本上通过分别比较每个数字来对数字进行排序。

算法的完整复杂度为 O(d(n + b)),其中 b 是选择的基础,d 是在那个基础上的位数。您几乎可以选择任何基,并使用该基中的数字。

这里的诀窍是选择正确的基础。有一个基础可以使算法 O(n),但如果你只使用基数 2,每个数字最多会有 O(4 logn) 位,所以总复杂度为 O(n logn)。

作为提示,存在一个基础,其中范围内的每个数字都具有恒定的位数。

【讨论】:

  • 那有什么依据呢?
  • 我不会明确地说出来,因为这似乎是一个家庭作业问题。几乎只有一种方法可以选择范围内的数字具有恒定位数的基础。就像我说的,这有点棘手。
  • 嗯,你不是说基地n,对吧?因为这确实是个骗局,除非您将其上的操作算作成本 O(log n),但这会让您回到与使用常量基数相同的情况
  • @harold 我怀疑操作的成本是 O(1)。根据您的解释,您甚至无法读取 O(n) 中的输入数据,因此问题显然是不可能的。虽然基数 n 不是唯一的选择,例如 sqrt(n) 也可以工作,但不能避免您的批评。
  • 是的,随机存取机器的现代约定是您对机器字(至少有对数位)进行单位成本操作。
【解决方案2】:

基数排序是我所知道的唯一一种可以在线性时间内运行的排序算法。

这是一个应该有用的链接 - Radix Sort implemented in C++

【讨论】:

  • 谢谢。如何确定要使用的基数值?
  • 如果你仔细观察,你会发现基数排序是 O(nlog_10(n))。
【解决方案3】:

据我所知,没有在 O(n) 中运行的排序算法,冒泡排序在 O(n^2) 中运行。快速排序在 O(n log n) 中运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多