排序应用程序难度

时间:2013-03-01 10:29:41

标签: algorithm sorting

目前我正在阅读一本关于算法的书,并发现了这种排序的用法。

  

重建原始订单 - 在我们为某些应用程序置换它们之后,我们如何恢复一组项目的原始布局?在项目的数据记录中添加一个额外的字段,以便第i个记录将此字段设置为i。无论何时移动记录,都要随身携带此字段,然后在需要初始订单时对其进行排序。

我一直在努力理解这是什么意思。我悲惨地失败了。请帮忙吗?

3 个答案:

答案 0 :(得分:5)

假设您有随机顺序的项目列表:

itemC, itemB, itemA, itemD

你把它们分类了:

itemA, itemB, itemC, itemD

并且您没有足够的内存将它们存储在单独的位置,因此原始序列将丢失。此外,原始顺序是随机的,恢复它会有问题/不可能。

本文提供了解决此问题的方法。

  

在项目的数据记录中添加一个额外字段,以便第i条记录将此字段设置为i

因此,我们为每个项目添加了一个额外的字段:

(itemC,1), (itemB,2), (itemA,3), (itemD, 4)

排序后我们有:

(itemA,3), (itemB,2), (itemC,1), (itemD, 4)

因此,我们可以通过附加字段轻松恢复初始订单排序

答案 1 :(得分:3)

假设您拥有数组中的数据,因为它是我可以用来举例说明的最简单的结构。

因此,您的节点(即数组的元素)可能如下所示:

 (some data type) data

该算法建议您添加一个整数字段,如下所示:

 (some data type) data,
 int              position

然后,用实际指数填充头寸。像这样的伪代码:

for current: 0 to lastElement
  array[current].position = current

(这不是用我所知的任何语言写的,但它应该是可读的)

这样做之后,你可以随心所欲地随意洗牌(诉诸它)。

如果要恢复原始排序,只需按position字段排序即可。

答案 2 :(得分:1)

嗯,基本上它说你需要某种东西来跟踪原始顺序(由排列破坏)。一种选择就是简单地颠倒排列(查看Steve Jessop的反应here)。

反转置换的另一个选择是需要更少的处理步骤,但需要更多的内存。更具体地说,输入集中的每个节点都有一个额外的ID字段,并且此输入集中的所有元素都根据此字段进行排序。应用排列后,很明显ID不再按排序顺序排列。如果您希望反转排列,您只需根据此字段再次对列表进行排序。