1

我正在尝试在 Javascript 中创建一个简单的“人力优先级”程序,并且我想找到一种根据用户输入对项目列表进行排序的方法。

我认为最好使用一种尽可能少的比较算法来实现这一点(以便向用户提供尽可能少的提示。)

我想按重要性对以下项目进行排序(其中每对项目的相对重要性由用户决定。):

1) Finish Haxe project

2) Finish Java project

3) Fix car

我想将这些项目成对呈现给用户,然后让他们决定哪个项目最重要。哪种排序算法最适合此任务(用户将在哪里比较项目?)

这是使用用户输入的自动优先级排序器的示例:http: //luhman.org/prioritizer-scheduler

更新:我已经写了一个脚本来做到这一点:就是这样。http://jsfiddle.net/fq3sy/1/

4

2 回答 2

1

JavaScript 数组提供了该sort方法,它允许传入一个回调函数来对非字符串进行自定义排序。如果您可以在这样的回调函数中执行“阻塞”用户输入集合,则可以使用所需的“哪个更重要”问题的集合对列表进行完全排序(可能window.confirm()带有“A 是否比 A 更重要”这样的问题乙?”)。这在漂亮的 UI 方面会很丑陋,但可能是实用且有效的。

为了避免在执行排序过程中出现问题回答,您至少可以为列表分配一个开始顺序,执行排序并记录要求的项目对,然后将所有这些对显示在一个列表中。两个项目中哪一个更重要的任何更改都会触发一个手段,然后用户将被要求仅回答那些新的项目(并且尚未被询问)。

Tad 允许用户拖放以对列表进行排序的想法可能很好(尽管听起来您想要“哪个更重要”流程代替),但我推荐 jQuery 及其Sortable 插件

要确定哪种排序算法最适合使用,这可能很困难。没有一种算法能以最少的步数可靠地对列表进行排序,因为所需的步数总是取决于项目的初始位置。一些排序算法确实更有效,但如果列表开始完全反向排序或以另一种与该算法相反的方式排序,它们仍然可能代价高昂。无论您使用哪种方案,都会有效率低下的方式。然而,有些比其他更好。

要解决这个问题,请从查看流行的排序算法开始。每种排序都有最好的情况、平均的和最坏的情况。在您在评论中链接的问题中,提问者说他​​的数据具有重复多次的排序键,因此回答者建议可能使用插入排序,其最佳情况是在输入已经排序时出现。但是,在列表完全相反的情况下,它的最坏情况性能非常糟糕,为 O(n2)。对于任意比较,几乎可以达到的最佳结果是 O(n log n)。

不过,我确实有一个减少问题数量的想法:首先显示带有一组 HML(高中低)按钮的整个项目列表,供用户为每个按钮分配总体优先级。这可以由用户非常快速地完成。完成后,分别对每个列表进行排序。这基本上是在进行分配排序,并将大量减少“哪个更重要”问题的数量。我的直觉是,对三个包含 10 个项目的列表进行排序比对一个包含 30 个项目的列表进行排序要便宜得多。

您最好的选择可能是合并排序或堆排序。但是您需要自己检查算法。也许您会在一切都乱序时在开始时使用一种排序,然后在以后的排序中使用一种在输入已经接近有序时性能最佳的方法。

无论如何,我将列表分解为 HML 类别的想法应该大大减少使用任何排序方法的步骤数。

经过一番思考,在我看来,让用户执行相当于插入排序的操作可能是一种合理的方法。为了实现它,不是让用户一次将一个未排序的项目与每个已排序的项目进行比较,只需要求用户将新项目放置在已排序项目中的正确位置即可。要求用户选择一个项目开始。它可以是最重要的、最不重要的,也可以是中间的某个地方——这并不重要。然后,显示一个项目的列表(有足够的空间容纳更多),然后一次显示一个,让他拖到适当的位置(或以其他方式选择)每个未排序的项目在列表中所属的位置。完成后,列表将被排序。这提高了效率,因为用户不必在每个步骤中一次一个地阅读(和比较)列表中的每一个项目——他 只要熟悉它,就会知道他的项目是属于列表中的已组织部分的顶部、中间还是底部。他将能够快速扫描明显不匹配的优先区域,然后将他必须仔细权衡以确定正确顺序的少数项目归零。任何时候,如果他改变了已经放置的物品的顺序,他可以重新排列它们。

作为最后的评论,我想建议您研究一下“完成事情”模型,它比“按优先顺序做事”模型具有一些优势。至少,拥有一个可信赖的计算机系统、安排和忘记它们以及避免重复相同工作的概念对于任何帮助用户完成工作的系统来说似乎都是无价的。

于 2012-11-27T02:31:59.287 回答
0

听起来像一个使用 Javascript http://tool-man.org/ToolManDHTML/sorting.html的拖放排序列表

您可以对 Example: A Basic List 进行排序,然后单击右侧的检查按钮以获取当前顺序。应该很容易适应你想要的。

注意:我与该网站没有任何从属关系 - 只是我在 google 中快速找到的第一个。

于 2012-11-27T02:18:30.600 回答