我正准备参加比赛并遇到了这个我无法理解的问题。 考虑一个数组中的一组'n'元素,除了一个按顺序出现的元素外,它被排序。以下哪个排序顺序需要O(n)时间?
现在我已经知道最好的方法是使用插入排序,在这种情况下需要花费O(n)时间,但由于它除了那个之外,我不确定使用哪个。
答案 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)。