证明存在一个O(n)的算法可以完成10次交换。

4
一个著名的问题是找到对于排序数组最小化交换次数。但我的问题是,给定一个大小为n的数组,并且我们知道可以通过10次交换将其排序(我们不知道具体的交换操作,只知道次数),我想证明存在一种O(n)算法(耗时)来对这个数组进行排序。
首先,为了证明这个命题,我需要展示一些代码吗?我不知道如何证明它。 其次,这与对于排序数组最小化交换次数有关吗?
感谢您的帮助。

1
O(n) 是指什么?你的前提已经说明存在一种可以在10次交换中对数组进行排序的算法。我猜这个算法在比较次数上是O(n)的,但是有内存限制吗? - trent
@trentcl O(n) 是关于时间复杂度的。我忘了提到这一点。没有内存限制。 - FrastoFresto
1
提示:Timsort可以解决这个问题。 - David Eisenstat
2个回答

3

你的解决方案在自适应排序算法中。

一个经典的自适应排序算法是直接插入排序。在这个排序算法中,我们从左到右扫描输入,重复找到当前项的位置,并将其插入到先前排序好的项的数组中。

我们知道:

该算法的性能可以用输入中的逆序对数量来描述,然后T(n)将大致等于I(A)+(n-1),其中I(A)是逆序对的数量。

因此,像您的情况一样,逆序对的数量是恒定的,该算法的复杂度将为Theta(n)


2
如果我们知道排序一个数组需要10次交换,那么最多有10 * 2 = 20个元素是无序的。因此,如果我们找到某些在近乎有序的数组上具有O(n)复杂度的排序算法,则足以证明您的说法。
例如,我们可以使用两步解决方案:
1. 找到数组中所有无序元素,移除并保存它们。 2. 在结果数组中插入保存的元素,并将其放置在正确的位置。
对于这种“朴素”的算法,第一步只需要一遍操作,第二步在最坏情况下需要20次或更少的操作(最多有20个无序元素)。因此,如果 n >> 10,那么在您的情况下,它将达到O(n)。如果不依赖于 n,则此证明对于任何交换次数都是正确的。

你会如何定义“乱序”元素,并提出什么O(n)算法来检测这些元素? - Mark Dickinson
@MarkDickinson “out of order”元素可以在数组元素序列中找到,该序列未按所需顺序排序。当我们遇到新的元素小于先前的元素时,我们知道这个或先前的元素是无序的。可能还有其他一些附近的元素。只要不超过20个这样的元素,就不难向后和向前检查以找到这种错误序列的边界。即使我们取多几个元素(例如每个出现的20个邻居),它也不会改变O复杂度。 - Alexander Ushakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接