これは、オランダ国旗問題の質問に対する私の回答を思い出させてくれます。
これが私が思いついたものであると考えた後、これがうまくいくかどうか見てみましょう. 主な問題は、O(1)
余分なスペースでのマージソートのマージステップだと思います。
リンクリストの表現:
[ 1 ] => [ 3 ] => [ 2 ] => [ 4 ]
^head ^tail
このマージ手順で終了します。
[ 1 ] => [ 3 ] => [ 2 ] => [ 4 ]
^p ^q ^tail
マージしたいセグメントの存在p
とポインタ。q
tail
ポインタの後にノードを追加するだけです。末尾*p <= *q
に追加する場合。p
[ 1 ] => [ 3 ] => [ 2 ] => [ 4 ] => [ 1 ]
^p ^pp ^q/qq ^tail ^tt
それ以外の場合は、 を追加しq
ます。
[ 1 ] => [ 3 ] => [ 2 ] => [ 4 ] => [ 1 ] => [ 2 ]
^p ^pp ^q ^qq/tail ^tt
(リストの末尾を追跡するのq
が難しくなります)
今、それらを動かすと、自分がどこにいるかすぐにわからなくなります。ポインターを移動したり、長さを方程式に追加したりする巧妙な方法で、これを打ち負かすことができます。私は間違いなく後者を好みます。アプローチは次のようになります。
[ 1 ] => [ 3 ] => [ 2 ] => [ 4 ]
^p(2) ^q(2) ^tail
[ 3 ] => [ 2 ] => [ 4 ] => [ 1 ]
^p(1) ^q(2) ^tail
[ 3 ] => [ 4 ] => [ 1 ] => [ 2 ]
^p(1) ^q(1) ^tail
[ 4 ] => [ 1 ] => [ 2 ] => [ 3 ]
^p(0)/q(1) ^tail
[ 1 ] => [ 2 ] => [ 3 ] => [ 4 ]
^q(0) ^tail
ここで、O(1)
余分なスペースを使用して要素を移動できるようにします。