前書き
この課題は、3つの(悪い)ソートアルゴリズムについてです:Bogosort
、および私が思いついた2つの他のバリアント(ただし、ある時点で他の人によって考えられていた):(Bogoswap
AKA Bozosort)およびBogosmart
。
Bogosort
完全にランダムに配列をシャッフルし、それがソートされた(昇順)になったかどうかをチェックすることで機能します。そうでない場合は、繰り返します。
Bogoswap
2つの要素をランダムに選択し、それらを交換することで機能します。ソートされるまで(昇順で)繰り返します。
Bogosmart
2つの要素をランダムに選択し、配列をソート(昇順)に近づける場合にのみそれらを交換することで機能します。インデックスが低い要素がもともと高い要素よりも大きい場合。ソートされるまで繰り返します。
チャレンジ
この課題では、これら3つのソートアルゴリズムのそれぞれの効率(または欠如)を探ります。ゴルフされたコードは
1から8までの整数の8要素配列のシャッフルを生成します(これをどのように行うかを確認するために読み続けてください)。
この配列に各アルゴリズムを適用します。そして
元の配列を表示し、その後に、各アルゴリズムに必要な計算数を1つのスペース(末尾スペースok)で区切って、の形式で表示します
<ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>
。
プログラムは10個のテストケースを生成します。最初に10個すべてを生成することも、一度に1個ずつ生成することもできます。以下の出力例。
詳細:
の場合Bogosort
、配列がシャッフルされた回数を記録する必要があります。
についてはBogoswap
、行われたスワップの数を記録する必要があります。
についてはBogosmart
、行われたスワップの数を記録する必要があります。
出力例:
87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34
私はこれらの数字を作りました。もちろん、プログラムは異なる出力を同じ形式で出力します。
ルール
- プログラムで使用されるすべてのランダム性は、利用可能な疑似乱数ジェネレーターから取得する必要があります。それ以外の場合は、ユーザーが広範囲に計算することはできません。種を気にする必要はありません。
- プログラムに時間制限はありません。
- 配列は昇順でソートされます。
- 末尾のスペースや余分な改行は大したことではありません。
- の場合
Bogosort
、配列は、説明で明示的に指定されている、Fisher-YatesやKnuth Shufflingなどの公平なシャッフルアルゴリズムを使用してシャッフルされます。組み込みのシャッフルメソッドは許可されていません。同じ方法でテスト配列を生成します。 - 配列をシャッフルまたは交換した後も同じままの場合は、それでもカウントされ、プログラムのカウントに含める必要があります。たとえば、偶然に配列をそれ自体にシャッフルするとシャッフルとしてカウントされ、要素をそれ自体と交換すると、これらの操作のいずれによっても配列が変更されない場合でも、スワップとしてカウントされます。
- 私の記憶が適切に機能する場合、8つの要素の配列は、3つのアルゴリズムのいずれについても、それほど長くはかかりません。実際、10要素の配列の場合は数回考えてみましたが、実際に試したところ、
Bogoswap
数千(またはそれ以下)の実際のシャッフルと10秒未満で済みました。 - コードは実際に配列をソートする必要があり、期待される答えに対して期待される値や数学的計算を与えるだけではありません。
- これはコードゴルフの挑戦なので、バイト単位で最も短いプログラムが勝ちます。
次に、各ソートアルゴリズムのサンプルステップをいくつか示します。
BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678
BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678
BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678
この場合、プログラムはを出力56781234 7 10 7
し、同じことを10回実行します。並べ替えの実行中に配列を出力する必要はありませんが、各アルゴリズムの動作と計算のカウント方法を理解できるように、上記のサンプル手順を示しました。