最大7つの比較で5つの整数の配列をソートします


19

最悪の場合に7つの比較が必要になるように、5つの整数のリストをソートするにはどうすればよいですか?他の操作がいくつ実行されるかは気にしません。私は整数について特別なことは何も知りません。

私はマージソートアプローチに従うか、マージソートとバイナリサーチを使用して挿入位置を見つけるなど、8つの比較にまで下がったいくつかの異なる分割統治アプローチを試しましたが、最終的には8つの最悪の場合を比較します。

今のところ、解決策ではなく、ヒントを探しています。


「比較先」ツリーを書いてみましたか?それは持っている個のリーフ。それぞれが整数の順列に対応します。「比較」ツリーの意味がわからない場合、n log nの比較が必要であることの証明を知っていますか?追伸、それが可能だと思う理由は何ですか?5!=120nlogn
PAL GD

1
さて、8ビット2の補数でif(x > y)は、if((x - y) & 0x80)ほとんど比較されません。私たちは、オブジェクトが整数であることを忘れなければならないと思いますし、我々はいくつかの魔法を使用する必要があるとcompare(x, y)...これらのオブジェクトを比較する機能を
KarolisJuodelė

2
「正確にこの質問を扱っているThe Art Of Computer Programmingの Volume 3の最適な並べ替えに関するセクション5.3をチェックしてください」はヒントまたは解決策としてカウントされますか?:-)
スティーブンスタドニツキ

3
バウンドは本当にある、および5 = 120 < 2 7 = 128。したがって、それ可能です(原則)。2cn5=120<27=128
フォンブランド

回答:


23

このプロセスを開始する方法は1つしかありません(また、後のステップで何を比較するかについてのほぼすべての決定に対して、正しいものは1つしかありません)。これを理解する方法は次のとおりです。最初に、比較のために取得できる回答はであり、5 =区別する必要がある120の異なる順列。27=1285=120

最初の比較は簡単です。2つのキーを比較する必要があり、それらについて何も知らないので、すべての選択肢が等しく良いです。それでは、あなたが比較しましょうとBを、そしてことがわかりB。これで、2 6 = 64の可能な回答が残り、60の可能な順列が残ります(それらの半分を削除したため)。abab26=6460

次に、dを比較するか、最初の比較で使用したキーの1つとcを比較できます。我々は比較した場合、CおよびDを、その学びC dは、その後、我々は持っている32cdccdcd32の残りの答えとの可能な順列を。我々は比較一方、Cを用いて、我々はその発見A Cを、我々は40我々が排除されたため、残りの可能な順列を1 / 3の可能な順列(とそれらのC 30caac401/3)。残りの回答は 32個しかありませんので、運が悪いです。cab32

これで、1番目と2番目のキー、3番目と4番目のキーを比較する必要があることがわかりました。我々は持っていると仮定することができBC dはeをこれらの4つのキーのいずれかと比較する場合、前のステップで使用した引数と同じ引数を使用して、1のみを削除します。同様のカウント引数は、比較する必要があることを示していますabcde、残りの順列の、そして私たちは運の外出します。したがって、キー a b c dの 2つを比較する必要があります。対称性を考慮すると、a cを比較するか、 a dを比較するかの2つの選択肢あります。1/3a,b,c,dacad cをするます。私たちは、その一般性を失うことなく想定することができC、そして今、私たちは持っている ≤のBC dはacacabacd

あなたがヒントを求めたので、私は議論の残りを通過しません。残り4つの比較があります。それらを賢く使用してください。


cを比較すると40個の順列しか得られないのはどうしてですか?ac
ロバートS.バーンズ

1
@Robert:あなたが持っていると仮定BCを。次いで、二置換が存在するB Cのこれらの制約と一致し、< B < C< C < Bは。これら2つの順列のそれぞれについて、dを追加できる4つの場所がありますabaca,b,ca<b<ca<c<bdを追加できる5つの場所があります。e
ピーターショー

8

これはD.KnuthのThe Art of Computer Programming vol IIIにありますが、戦略は次のとおりです(配列があると仮定します):ヒントを読みたい場合私の答えの最初の2行だけ{a,b,c,d,e}

  • 番号の最初のグループペア:(a,b),(c,d)
  • ペアを比較してソートします(例:a<b,c<d
  • ペアの最小要素を比較して、結果(例えば)を取得しますa<c
  • 最後の要素、最後の比較でより大きな要素と比較します(cec
    • 場合、残り3つの比較で簡単に終了します。終わった。e<c
    • 場合、知識c < e c < dで{ b c d e }をソートする必要があります。 e>c{b,c,d,e}c<e,c<d
      • d < eの場合 Compare(d,e)d<e
        • b > dの場合d Compare(b,d)b>d
          • 。終わった。Compare(b,e)
        • b < dの場合b<d
          • 。終わった。Compare(b,c)
      • d > eの場合d>e
        • 場合 B > ECompare(b,e)b>e
          • 。終わった。Compare(b,d)
        • b < eの場合b<e
          • 。終わった。Compare(b,c)

上記のすべての方法は、cを最初に比較した後、最大3回の比較の原因となります。(最大7を意味します)。 ec


これは正しいですか?次の結果が得られると仮定します:a <b、c <d、a <c、そしてc <e、b <e、c <b、d <e。順序a <c <b <d <eおよびa <c <d <b <eは両方とも一貫しています。その理由は、bとdが暗黙的または明示的に比較されることは決してないからです。多分私はどこかに間違えているので、もしそうなら私を修正してください。
ジョージ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.