「分割統治」の要点は、作業を複数の小さな問題に分割することです。次に、小さな問題を解決し、ソリューションに結合されるまでそれらをロールアップします。これは、再帰的な解決策を意味します。
再帰関数では、常に「基本ケース」が必要です。これは簡単に解決できる簡単なケースです。たとえば、瓶が 1 つと蓋が 1 つしかない場合は、瓶が蓋と一致することを返すだけです。(問題文の一部として、各瓶に常に 1 つの一致する蓋があるためです。)
したがって、開始する場所の 1 つは、長さ 1 の jar/lid のリストに対してのみ正しく機能する簡単なプログラムです。次に、より多くの機械を追加して、より能力を高めます。
クイックソートでは、数値を分割する場所 (「ピボット」) を選択してから、非常に大まかな並べ替えを行います (ピボットの左側にあるはずの右側にある数値を取り出して左に移動し、およびその逆)。次に、サブリストで再帰的にクイックソートを呼び出します。最終的に、クイックソートへの再帰呼び出しのそれぞれが、基本ケース (長さ 1 のサブリスト) にヒットします。それらがすべて基本ケースにヒットすると、クイックソートが実行されます。(注: クイックソートを最適化し、コードを追加して高速化する方法はありますが、ここではクイックソートの最も単純な実装について説明します。)
この場合、1 から n までの数字だけの長さ n のリストから始めて、正しいリストが得られるまで数字を交換する必要がありますか?
うーん。長さ 2 のリストでは、2 つの可能性しかありません: リストが整列するか、整列しないかです。並んだら完成です。そうでない場合は、数字を入れ替えて並べれば完了です。うーん。これはある意味で並べ替えに似ていますが、並べ替えのように数値を直接比較することはできません。(並べ替えでは、3 つ並べ替えると 5 未満になることが常にわかっていますが、ここではそうではない可能性があります。) そこで、リストを分割する方法を考えて、長さ 2 または長さ 1 のサブリストができるまでそれを続けます。次に、それらの些細なケースを処理します。
楽しい問題のように聞こえます。楽しんで取り組んでいただければ幸いです。