我正在寻找一种用于int数组的排序算法,该算法不会分配除数组大小以外的任何字节,并且仅限于两条指令:
交换:将下一个索引与当前索引交换;
MOVE:将光标移至+1或-1索引;
也就是说,100
仅交换index之后,就不能交换非相邻索引,也不能交换索引10
。什么是最有效的算法-即使用较少总移动量的算法?
13
并不奇怪,它是一台物理机器,可以对粘在隆起的胶带上的手推车列表进行分类。机器只能向前或向后移动磁带,并且只能交换相邻的卡片。在现实世界中,您无法传送到周围,所以这些就是限制...
—
MaiaVictor
因此,当您说要使用一种不分配除数组大小以外的任何字节的算法时,我想您仅指的是元素存储,对吗?我仍然可以分配计数器等吗?
—
Darkhogg
行,可以。当然。您可以分配一些其他结构。您甚至可以分配整个数组并进行大量真正的繁重计算,这算作零成本。您唯一需要减少的是实际物理计算机的SWAP / MOVE数量,因为它很慢。冒泡排序是我能想到的最好的选择,但我想应该有更好的选择。
—
MaiaVictor
我认为没有这样的算法。没有任何额外的内存,您将无法存储任何控件状态。
—
拉斐尔
@svrm:是的,然后具有无限的RAM并能够将磁带复制到RAM并免费对它进行任意计算,就磁带的移动次数而言,“尝试一切并应用最佳”算法是最佳的。不太可能实用,但这是因为在实践中运行时间将为数百万年,而不是0 ;-)如果将N长度的磁带复制到RAM中花费了N步,那么幼稚的蛮力可能不是最佳的,但它在N内最佳。但是,这都不是特定于您的问题的:使用伪造算法可以“离线”解决以这种方式陈述的许多问题。
—
史蒂夫·杰索普