以最小移动次数对一组磁盘进行排序

时间:2017-05-07 10:05:53

标签: arrays algorithm sorting

所以这个问题更像是一个寻求问题的算法/方法,我正在寻找关于如何解决这个问题的任何想法/见解。我正在浏览一组编程问题并遇到一个问题,我需要提供排序项目列表所需的最小移动次数。虽然这个问题被标记为“简单”,但我找不到一个好的解决方案。欢迎你的想法。 问题陈述是这样的。

X有N个半径相等的磁盘。每个磁盘都有一个与之关联的1到N的不同数字。将磁盘以随机顺序一个放在另一个堆中。 X希望按顺序从上到下对这堆磁盘进行排序。但他有一种非常特殊的方法。 只需一步,他就可以从堆中选择一个磁盘,而且只能将它放在顶部。并且X希望以最少的可能步骤对他的一堆磁盘进行排序。你能找到对这堆随机排序的磁盘进行排序所需的最小移动次数吗?

1 个答案:

答案 0 :(得分:1)

在不考虑采取最小动作的情况下解决问题的简便方法是:     获取最大值的磁盘并将其置于顶部。然后取第二个最大值并将其置于顶部。等等,直到所有的都被分类。现在这种贪婪的方法并不总能给你最小的步骤。

考虑这个例子:[5,4,1,2,3]采用上述贪心方法,它将是这样的:

[5,4,1,2,3] 
[4,1,2,3,5]
[1,2,3,5,4]
[1,2,5,4,3]
[1,5,4,3,2]
[5,4,3,2,1]

这需要5次移动,但最小移动应该是这样的:

[5,4,1,2,3]
[5,4,1,3,2]
[5,4,3,2,1]

仅需2个

要获得最小移动,首先要考虑从N开始按降序排列了多少个值,您可以考虑那些不需要移动的东西。而对于其余的你必须移动哪个是最小值。例如

[1,5,2,3,10,4,9,6,8,7]

从10开始,总共有4个数字按顺序排列[10,9,8,7],其余部分需要移动。所以最小移动将是10-4 = 6

[1,5,2,3,10,4,9,6,8,7]
[1,5,2,3,10,4,9,8,7,6]
[1,2,3,10,4,9,8,7,6,5]
[1,2,3,10,9,8,7,6,5,4]
[1,2,10,9,8,7,6,5,4,3]
[1,10,9,8,7,6,5,4,3,2]
[10,9,8,7,6,5,4,3,2,1]