【问题标题】:Sorting an array which is already sorted, Except one element which is out of order对已经排序的数组进行排序,除了一个乱序的元素
【发布时间】:2014-10-02 19:12:24
【问题描述】:

我在准备比赛时遇到了这个问题,我无法理解。 考虑一个数组中的一组“n”个元素,除了一个出现乱序的元素外,它都是排序的。以下哪个排序序列需要 O(n) 时间?

  • 快速排序
  • 堆排序
  • 合并排序
  • 冒泡排序

现在我已经知道最好的方法是使用插入排序,在这种情况下这将花费 O(n) 时间,但由于它告诉其他人,我不确定该使用哪个。

  • 快速排序会很糟糕,因为数组已经排序了。
  • 堆排序不会完全利用数组排序的属性,需要 O(nlogn) 时间。
  • 合并排序也需要 O(nlogn),因为它不区分输入顺序。
  • 冒泡排序也需要 O(n^2)。 真的很想在这里得到一些帮助,我错过了什么吗?

【问题讨论】:

  • 您将不得不比您在此处提供的粗略摘要更深入地分析算法。
  • 如果你使用修改后的 BubbleSort 只运行 2 次迭代,一次从左边,一次从右边,它将花费 O(n) 时间。
  • 如果您总是选择第一项或最后一项作为基准,则对已排序数组的快速排序仅为 O(n^2)。如果您选择中间项目(或随机项目),则为 O(n log n)。
  • @MarkRansom:好吧,我只考虑了算法中适合我的问题的部分。您认为我们可以修改堆排序以使其更好一点吗?

标签: arrays algorithm sorting


【解决方案1】:

natural variant of merge sort 将在 O(n) 时间内对描述的列表进行排序。

它的工作原理与归并排序相同,但从识别数据中的自然运行开始。因此它将识别未排序元素周围的两个运行(已排序组),然后将未排序元素合并到其中一个运行中,然后将两个运行合并在一起。这只需要两次 O(n) 合并(加上一些 O(n) 运行检测),无论数据大小如何,都是 O(n)。

【讨论】:

  • 这看起来不错。还有一件事,您认为我们可以使用 QuickSort 一次运行,其中元素不合适作为支点?
【解决方案2】:

如果恰好有一个元素乱序,您可以找到它,然后将其插入到正确的位置 -> O(n) 的努力。

【讨论】:

  • 完全正确。为什么需要使用排序。只需线性比较连续元素,直到发现违规。
  • 嗯,问题的重点是(正如我所理解的那样):列出的标准排序算法中的哪一种可以做到这一点?
【解决方案3】:

插入排序仍然需要 O(n^2),因为它不会检查数组是否已排序。最好的解决方案是冒泡排序,因为它会扫描数组两次:第一次会将元素移动到正确的位置,第二次会意识到数组已排序。它在每次迭代中进行的交换次数。

不幸的是,事情并没有这么简单;它取决于未排序项目相对于其正确位置的位置。 AndyG 提供的解决方案在所有情况下都会使其成为 O(n)。

【讨论】:

  • 取决于元素是在其最终目的地之前还是之后开始。
  • 不正确。考虑 1,2,3,4,5,6,7,8,9,0 的情况,如果冒泡排序是左->右,则需要 O(n^2) 时间。请参阅我对 OP 关于修改后的冒泡排序的评论。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2023-03-14
  • 2019-09-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多