JavaScript配列はsort
、コールバック関数を渡して非文字列のカスタムソートを実行できるようにするメソッドを提供します。このようなコールバック関数で「ブロック」ユーザー入力コレクションを実行できる場合は、必要な「どちらがより重要か」という質問のセットを正確に使用してリストを完全に並べ替えることができます(おそらく、window.confirm()
「 B?」)。これは、美しいUIの観点からは醜いですが、実用的で機能する可能性があります。
並べ替えの実行中に質問応答が発生しないようにするには、少なくともリストに開始順序を割り当て、並べ替えを実行して、要求されたアイテムのペアを記録してから、それらすべてのペアをリストに表示します。2つの項目のどちらがより重要であるかを変更すると、リゾートがトリガーされ、ユーザーは、新しい(まだ尋ねられていない)項目のみに回答するように求められます。
ユーザーがドラッグアンドドロップしてリストを並べ替えることができるようにするというTadのアイデアは良いかもしれませんが(代わりに「より重要な」フローが必要なようですが)、jQueryとそのSortableプラグインをお勧めします。
どのソートアルゴリズムを使用するのが最適かを検討するのは難しいかもしれません。必要なステップ数は常にアイテムの初期位置に依存するため、1つのアルゴリズムがリストを最小のステップ数で確実にソートすることはできません。一部の並べ替えアルゴリズムは確かに効率的ですが、リストが完全に逆に並べ替えられたり、そのアルゴリズムに敵対する別の方法で並べ替えられたりすると、コストがかかる可能性があります。どのスキームを使用しても、非効率的な方法があります。ただし、他のものより優れているものもあります。
この問題に対処するには、まず、一般的な並べ替えアルゴリズムを確認します。各ソートには、ベストケース、平均、およびワーストケースのシナリオがあります。コメントでリンクした質問で、質問者は自分のデータに何度も繰り返される並べ替えキーがあると述べたため、回答者は、入力が既に並べ替えられているときに最良のケースが発生する挿入並べ替えを使用することを提案しました。ただし、リストが完全に逆になっている場合は、最悪の場合のO(n2)のパフォーマンスが非常に悪くなります。任意の比較の場合、達成できる最善の方法はO(n log n)です。
ただし、質問の数を減らすためのアイデアが1つあります。まず、アイテムのリスト全体にHML(高中低)ボタンのセットを表示して、ユーザーがそれぞれに全体的な優先順位を割り当てることから始めます。これは、ユーザーが非常に迅速に実行できます。完了したら、各リストを個別に並べ替えます。これは基本的に配布ソートを行っており、「どちらがより重要か」という質問の数を大幅に削減します。私の本能によれば、それぞれ10個のアイテムの3つのリストを並べ替える方が、30個のリストを1つ並べ替えるよりもかなり安価です。
最善の策は、おそらくマージソートまたはヒープソートです。ただし、アルゴリズムを自分で調べる必要があります。おそらく、すべてが故障しているときに最初に1つのソートを使用し、その後のソートでは、入力がすでに順序に近いときに最高のパフォーマンスを発揮するメソッドを使用します。
いずれにせよ、リストをHMLカテゴリに分割するという私の考えは、どのソート方法でもステップ数を大幅に減らすはずです。
もう少し考えてみると、挿入ソートに相当するものをユーザーに実行させるのが妥当な方法であるように思われます。これを実装するには、ユーザーにソートされていないアイテムを一度に1つずつ、すでにソートされている各アイテムと比較させるのではなく、新しいアイテムをすでにソートされているアイテムの正しい場所に配置するようにユーザーに依頼します。最初に1つのアイテムを選択するようにユーザーに依頼します。それは最も重要、最も重要でない、または中間のどこかになります-それは問題ではありません。次に、1つのアイテムのリストを表示し(さらに多くのスペースがあります)、一度に1つずつ、リスト内の並べ替えられていない各アイテムが属する場所にドラッグしてもらいます(または選択します)。完了すると、リストが並べ替えられます。これにより、ユーザーはリスト内のすべてのアイテムを各ステップで一度に1つずつ読み取る(および比較する)必要がなくなるため、効率が向上します。彼のアイテムがリストの上部近く、中央、または下部にあるかどうかは、そのアイテムに精通しているだけでわかります。彼は、明らかに一致しない優先度の領域をすばやくスキャンしてから、適切な順序を決定するために慎重に計量する必要のあるいくつかの項目に焦点を当てることができます。いつでも、すでに配置されているアイテムの順序について気が変わった場合、彼はそれらを再配置することができます。
最後のコメントとして、Getting Things Doneモデルを検討することをお勧めします。このモデルには、「優先順位に従って実行する」モデルに比べていくつかの利点があります。少なくとも、信頼できるコンピューターシステムを用意し、スケジュールを立てて忘れ、同じ作業を繰り返さないようにするという概念は、ユーザーが物事を成し遂げるのに役立つシステムにとって非常に貴重なようです。