t_wの輪郭

Feedlyでフォローするボタン
quicksort
作業表の作業に星をつけて並び替えると早く並び替えられるクイックソートの応用あれ急揃え

あれ

2024/5/15 7:38:00

Prologだと6行でクイックソートがかけるのヤバすぎる。

qsort([], []).
qsort([X], [X]).
qsort([X | L], L1) :- separate(X, L, UpperList, LowerList), qsort(UpperList, UpperListSorted), qsort(LowerList, LowerListSorted), flatten([LowerListSorted, [X], UpperListSorted], L1).
separate(X, [], [], []).
separate(X, [Y | L], [Y | UpperList], LowerList) :- X =< Y, separate(X ,L, UpperList, LowerList).
separate(X, [Y | L], UpperList, [Y | LowerList]) :- X > Y, separate(X ,L, UpperList, LowerList).

memberを使えばseparateをもう1行減らせそう。と思ったが、上手くいかなかった。

 やることリストTODOリスト)が大きくなると並び替えがしんどくなる。
 そこでクイックソートを応用する。

  1. 上から順番に先頭の項目と、各項目の重要度あるいは優先度を比較する(このとき、星マーク)が同数でないものについては比較は不要である)
  2. 先頭の項目より重要な項目の先頭に星マークを追加する
  3. 星マークの数の数が多い項目順に並び替える
  4. 気が済むまで1,2,3を繰り返す


 この操作では重要なものほど重要度に応じて精緻に並ぶ。重要でないものの重要度は比較しない。どうせやらないので。

 完全に並び替えず、大体のところで終わらせると良い。重要度は日々変化する。揺らぎを受け止める緩みを持たせる。星マークが完全に階段になると揺らぎを受け止められない。

 クイックソートよりももっと楽な方法があるかもしれない。先頭の項目の重要度が低いと、★だらけになる。
バブルソートはだめだった。いくつかのタスクに★がついてないとやる気にならなかった。1回リストをなめれば最も重要なタスクが一番上に来るのは良かった。

 やることリストの中に階層があるとこれはできない(やりにくい)




 並び替えの様子