仕組み
仕組みはめちゃくちゃにシンプルです。
- 要素をバラバラに並べる
- ソート済みか調べ、ソートされていなければ1に戻る
簡単に言えば、適当にシャッフルされていればいずれはソートされているだろうという手法です。
計算量はなんとというソートのアルゴリズムで最弱になっています。
ただ私的にはロマンがあって嫌いじゃないですね。
コード
public static IEnumerable<T> BogoSort<T>(IEnumerable<T> collection) where T : IComparable<T> { if (collection.Count() == 0) return null; // ループ内で何度も遅延評価を行うと速度が遅くなる場合がある気がしたので予め配列を作成 var items = collection.ToArray(); T[] target = null; var isSorted = false; while (!isSorted) { // ランダムに配置 target = items.OrderBy(t => Guid.NewGuid()).ToArray(); isSorted = true; for (int i = 0; i < target.Length - 1; i++) { // 昇順になっているか確認 if (target[i].CompareTo(target[i + 1]) > 0) { isSorted = false; break; } } } return target; }
使い方
static void Main(string[] args) { var target = new int[] { 1, 3, 2, 5, 4 }; foreach (var item in BogoSort<int>(target)) { Console.WriteLine(item); // 1 2 3 4 5 } }
さいごに
今思うと昇順に固定になってしまっているので、IComparer
を引数にとって自由に比較方法を設定できるようにしたほうが良かったかもしれません。
まだまだ改良の余地はあると思うので、是非自分なりのボゴソートを作ってみてください。
ではまた。