用于对数组进行排序的最小“插入”数

时间:2013-12-05 06:09:41

标签: algorithm sorting

假设有一个无序列表。我们唯一可以做的操作是移动一个元素并将其插回任何地方。对整个列表进行排序需要多少步骤?

我猜答案是size of the list - size of longest ordered sequence,但我不知道如何证明它。

2 个答案:

答案 0 :(得分:5)

首先请注意,移动元素不会改变被移动元素的相对顺序。

考虑最长的非递减子序列(与the longest increasing subsequence密切相关 - 找到它们的方式相似)。

通过仅移动不在此序列中的元素,很容易看出我们最终得到了一个排序列表,因为此序列中的所有元素已经相对于彼此进行了排序。 / p>

如果我们不移动此序列中的任何元素,则此子序列中两个元素之间的任何其他元素将保证大于较大元素,或小于较小元素(如果不是这样,它本身将是最长的序列),因此需要移动 (见下文)

是否需要不减少?是。考虑此序列中的两个连续元素是否正在减少。在这种情况下,如果不移动这两个元素就不可能对列表进行排序。

为了最大限度地减少所需的移动次数,只需选择最长的序列即可,如上所述。

因此,所需的移动总数是列表的大小减去最长的非递减子序列的大小。

解释不在上述非递减子序列中的元素值的示例:

考虑最长的非递减子序列1 x x 2 x x 2 x 4x' s是一些不属于序列的元素。)

现在考虑x2之间4的可能值。

如果是2,3或4,则最长的子序列将包括该元素。如果它大于4或小于2,则需要将其移动。

答案 1 :(得分:-1)

很容易证明size of the list - size of longest ordered sequence总是足以对任何序列进行排序,例如数学归纳法。

您还可以轻松地证明,对于某些无序序列,只需找到这样无关紧要的序列就可以做到最好。例如。要对序列3,1,2进行排序,你需要移动一个项目(3),并且可以看到它不能更快​​,显然size of the list - size of longest ordered sequence等于1。

然而,证明它对所有序列都是最好的是不可能的,因为该语句实际上并不正确:反例是具有多个已排序子序列的序列S[i],其中max(S[i]) < min(S[i+1])为每个i。例如,参见序列1,2,3,1000,4,5,6。