web-dev-qa-db-ja.com

バブルソートは何に適していますか?

バブルソートには実際の用途がありますか?私が言及したものを見るたびに、それは常に次のいずれかです:

  1. 学習するソートアルゴリズム。
  2. 使用するソートアルゴリズムの例not
44
Jason Baker

データの分散方法に依存します-何らかの仮定を立てることができるかどうか。

バブルソート(または他のソート)を使用するタイミングを理解するために私が見つけた最高のリンクの1つは、ソートアルゴリズムのアニメーションビューです。

http://www.sorting-algorithms.com/

43
Remy Sharp

バブルソートは、(おそらく)非常に特定の状況下で利用可能な最速のソートです。もともとよく知られるようになったのは、それが厳密に分析された最初のアルゴリズム(あらゆる種類)の1つであり、限られた状況で最適であるという証拠が見つかったためです。

テープドライブに保存されたファイルと、ランダムアクセスメモリ(または大きなキー)がほとんどないため、任意の時点でtwoレコードのみをメモリにロードできるとします。テープの巻き戻しは十分に遅いため、ファイル内でランダムアクセスを実行することは一般的に非実用的です。可能であれば、一度に2つ以下のレコードを順番に処理します。

テープドライブが一般的で、数千(ワード|バイト)のRAM(あらゆる種類の))しか一般的ではなかったマシンは、勉強する価値があるほど十分に現実的でした。今ではまれであるため、バブルソートの学習はほとんど意味がありませんが、さらに悪いことに、最適な状況はとにかく教えられていないため、適切な状況が発生した場合でも、ほとんど誰もしません実現それ。

非常に小さいおよび/またはほぼソートされたデータセットで最速である限り、それはバブルソートの弱さを(少なくともある程度まで)カバーすることができますが、挿入ソートは基本的にどちらか/両方の場合に常に優れていますそれら。

75
Jerry Coffin

現実の世界ではあまり使われません。 implementを理解しやすく、高速であるため、優れた学習ツールです。悪い(O(n ^ 2))最悪のケースと平均的なパフォーマンスがあります。データがほとんどソートされていることがわかっている場合、ベストケースのパフォーマンスは良好ですが、このプロパティを持つアルゴリズムは他にもたくさんあり、最悪および平均のケースパフォーマンスが向上しています。

19
Bill the Lizard

私は最近、最適化の逸話でそれの大きな用途に出くわしました。プログラムには、各フレームで深度順にソートされた一連のスプライトが必要でした。スプライトの順序はフレーム間であまり変わらないため、最適化として、フレームごとに単一パスでバブルソートされました。これは両方向(上から下、下から上)で行われました。そのため、スプライトは常に非常に効率的なO(N)アルゴリズムでほぼソートされていました。

10
workmad3

tinyセットの場合、おそらく最速です。

教育といえば。 sorting out sort の最後のシーンへのリンクは、驚くべきものです。見なければならないものだ。

7

最近、アルゴリズムの最適性の証明にバブルソートを使用しました。オブジェクトのシーケンスで表される任意の最適なソリューションを、アルゴリズムで見つかったソリューションに変換する必要がありました。アルゴリズムは「この基準で並べ替える」だけであったため、最適なソリューションを悪化させることなくソートできることを証明する必要がありました。この場合、バブルソートは、隣り合って間違った順序にある​​2つの要素を単に交換するというニースの不変式があるため、使用するのに非常に良いアルゴリズムでした。もっと複雑なアルゴリズムを使用すると、頭脳が溶けてしまうでしょう。

ご挨拶。

3
Tetha

これは小さなデータセットに適しています。これが、パーティションサイズが小さくなると一部のqsort実装がデータセットに切り替える理由です。ただし、挿入ソートは依然として高速であるため、教材として使用する以外に使用する正当な理由はありません。

3

Bubble sort は実装が簡単で、小さなデータセットがある場合は十分に高速です。

セットがほぼソートされている場合(たとえば、1つまたは複数の要素が正しい位置にない場合)、バブルソートは十分に高速です。この場合、0-indexからn-indexおよびn-indexから0-indexのトラバースをインターレースすることをお勧めします。 C++を使用すると、次の方法で実装できます。

void bubbleSort(vector<int>& v) { // sort in ascending order
  bool go = true;
  while (go) {
    go = false;
    for (int i = 0; i+1 < v.size(); ++i)
      if (v[i] > v[i+1]) {
         swap(v[i], v[j]);
         go = true;
      }
    for (int i = (int)v.size()-1; i > 0; --i) 
      if (v[i-1] > v[i]) {
         swap(v[i-1], v[i]);
         go = true;
      }
  }
}

隣接する2つのアイテムのスワップがチップであり、任意のアイテムのスワップが高額な場合に便利です。

ドナルドクヌースの有名な「コンピュータープログラミングの芸術」では、「バブルの並べ替えは、キャッチーな名前と、いくつかの興味深い理論上の問題につながるという事実を除いて、それを推奨するものはないようだ」と結論付けました =。

このアルゴリズムは実装が容易であるため、サポートが容易であり、実際のアプリケーションライフサイクルではサポートの労力を削減することが重要です。

2
sergtk

理解と実装が非常に簡単であるため、優れた「教育」アルゴリズムだと思います。また、同じ理由で小さなデータセットにも役立つ場合があります(ただし、O(n lg n)アルゴリズムの一部は実装も非常に簡単です)。

2
Jay Conrod

より高速に言及することで、バブルソートに関する発言への応答に抵抗することはできません(O(nlogn)と思われますが、これは実際には証明されていません) Comb Sort 。事前に計算されたテーブルを使用する場合、Combソートは少し高速であることに注意してください。櫛の並べ替えはバブルの並べ替えとまったく同じですが、最初は隣接する要素を交換することで開始されない点が異なります。バブルソートと同じくらい簡単に実装/理解できます。

2
Brian

私は、TRS-80モデル1の小さなNの場合に使用していました。forループを使用すると、1つのプログラム行で完全なソートを実装できます。

それ以外は、教えるのに適しています。また、ほとんどソートされたリストの場合にも役立ちます。

1
EvilTeach

私はかつて、大部分の時間で2つのアイテムをソートする場合に使用していました。

次回そのコードを見たとき、誰かがそれをライブラリの並べ替えに置き換えました。彼らが最初にそれをベンチマークしたことを願っています!

1
Mark Ransom

コーディングが迅速かつ簡単であり、(間違えることはほとんど不可能です)。あなたが重い持ち上げをしておらず、ライブラリソートのサポートがない場合、それは場所です。

1
Brian Knoblauch

それは私が実際に最も頻繁に使用する種類です。 (このプロジェクトでは、外部ライブラリを使用できません。)

データセットが本当に小さいことを確信している場合に役立ちます。そのため、速度については少しも気にせず、最短で最も単純なコードが必要です。

バブルは最低でもありません。最近、私はちょうど3つの要素を並べ替える必要がある状況にありました。私はこのような何かを書いた:

// Use sort of stooge to sort the three elements by cpFirst

SwapElementsIfNeeded(&elementTop, &elementBottom);
SwapElementsIfNeeded(&elementTop, &elementMiddle);
SwapElementsIfNeeded(&elementMiddle, &elementBottom);

*pelement1 = elementTop;
*pelement2 = elementMiddle;
*pelement3 = elementBottom;
1
buti-oxa

ああ、それは良い選択メカニズムです。誰かが書いたコードでそれを見つけた場合、あなたは彼を雇わない。

0

主にnothing。代わりにQuickSortまたはSelectionSortを使用してください...!

0
Thomas Hansen