用排序重新排序多个项目的算法

时间:2015-01-22 08:38:00

标签: php algorithm sorting

当我同时重新排序多个项目时,我确实遇到了问题,让我用这个例子更清楚地说明问题:

如果我最初有这张桌子:

enter image description here

据说我想把A和B排在第4和第5位,我应该期待一个看起来像这样的结果:

enter image description here

然而,我绝对不知道我将如何系统地做到这一点。最初我尝试通过一次考虑改变来重新排序它们。

我的算法是:

1)如果一个项目的等级要降低:

调整所需等级以上的所有其他项目,将其等级提高1,直到达到原始项目的等级。因此,假设我想将 D 等级4移动到2。

enter image description here

我将向上移动B和C,直到D的原始等级被填满。然后我更新D的等级。

2)如果要将某个项目的等级提高,请执行相反的操作。

问题:

如果我使用这个算法将A和B分别排在第4和第5位,那么这里将会发生什么:

enter image description here

这是错误的。因为当然错误的算法。我最初移动A, A 获得排名4 ,但由于我只是逐个调整,所以当我尝试时, A 也会被移动重新排名 B

问题:

什么是同时重新排序多个项目的最佳算法?并保持受影响项目的排名顺序?我在php btw编码,所以如果你能提供一个示例代码就会非常棒,但算法就足够了。

修改:

我在下面添加了3个示例来演示所需的动作:

enter image description here

1)#1案例:将 C移至2 B移至4

  • C和B当然是移到各自的行列。但是我们确实知道A,D和E的初始排序是1,4和5.但是由于4将被采用,我们将不得不调整以降低D的等级而不是增加它自4级和5级以来都被带走了。 A和E.一样保持不变,不变。
  • 我们知道A在D之前出现,在E之前出现D,填补了1,3和5的空白。

2)#2案例:将 E移至1 ,将 A移至4。

  • 逻辑上,如果我们首先移动A,那么B应该在#1上。但由于E是一个考虑因素,而不是上升。调整等级。
  • 不过,我们知道B,C和D也有订单。首先是B,然后是C然后是D,以同样的方式填补"未采用的"斑点。

3)#last例子,这里只是简单地将A移动到5。   - 调整所有其他人。

1 个答案:

答案 0 :(得分:1)

就个人而言,我会创建一个堆栈作为临时持有者。首先推入排名最低的值(B),然后下一个(A)然后推送其他项目从下到上。在此之后将堆栈推回到列表中,首先从新的最高等级开始(C,D,E,A,B)。但是,如果您的项目列表很大,则可能需要相当大的处理能力,因此可能不是最佳解决方案。