对已经排序的数组进行排序,除了一个乱序的元素

时间:2014-10-02 19:12:24

标签: arrays algorithm sorting

我正准备参加比赛并遇到了这个我无法理解的问题。 考虑一个数组中的一组'n'元素,除了一个按顺序出现的元素外,它被排序。以下哪个排序顺序需要O(n)时间?

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

现在我已经知道最好的方法是使用插入排序,在这种情况下需要花费O(n)时间,但由于它除了那个之外,我不确定使用哪个。

  • 由于数组已经排序,因此快速排序将非常糟糕。
  • 堆排序不会完全利用数组排序的属性,并且将花费O(nlogn)时间。
  • 合并排序也需要O(nlogn),因为它不区分输入顺序。
  • 冒泡排序也需要O(n ^ 2)。 我真的希望得到一些帮助,我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

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

它的工作方式与合并排序相同,但首先要确定数据中的自然运行。因此,它将识别未排序元素周围的两个运行(排序组),然后将未排序的元素合并到其中一个运行中,然后将两个运行合并在一起。这只需要两次O(n)合并(加上一些O(n)运行检测),无论数据的大小如何,所以它的O(n)。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

相关问题