我们在堆栈中有N个数字,我们希望用最少的操作数对它们进行排序。唯一可用的操作是在堆栈顶部反转最后的K个数字(K可以在2和N之间)。
例如,要对序列“2 3 4 5 1”进行排序,我们需要两个步骤:
2 3 4 5 1 ---> 1 5 4 3 2 ---> 1 2 3 4 5
是否有任何多项式算法可以找到所需的最少步骤数?
答案 0 :(得分:4)
我认为你在谈论着名的Pancake排序算法。
Quoting from wikipedia : "The maximum number of flips required to sort
any stack of n pancakes has been shown to lie between (15/14)n and (18/11)n,
but the exact value is not known. The simplest pancake sorting algorithm requires
at most 2n−3 flips.
In this algorithm, a variation of selection sort, we bring the largest pancake
not yet sorted to the top with one flip, and then take it down to its final
position with one more, then repeat this for the remaining pancakes.
Note that we do not count the time needed to find the largest pancake, only the
number of flips; if we wished to create a real machine to execute this algorithm
in linear time, it would have to both perform prefix reversal (flips) and be
able to find the maximum of a range of consecutive numbers in constant time"
答案 1 :(得分:1)
可以在2N-3步骤(最坏情况)中完成
找到'1'的位置
将它拖到最后(一步)
将其随机播放(反转所有N)
找到2的位置
随机播放
随机播放(反向最后N-1)
REPEAT ...
当你考虑元素N-1时,它要么已经在正确的位置,要么在最后。最糟糕的情况是你还需要一次逆转来完成。这给你2N-3。
当您利用某些内在顺序时,您可以为给定的序列做得更好。我有一种预感,即最大化元素“顺序”的初始步骤可能是好的 - 也就是说,做一个初始步骤,使“所有元素的数量比它们左边小的元素数量”最大。例如,从43215
开始,初始完全反转会给出51234
(订单号= 3),之后我的算法只需两步即可获得正确的顺序。我不确定这是否一般。