バブルソート
[Wikipedia|▼Menu]

バブルソートバブルソートがどのように動作するかの視覚的な説明
クラスソート
データ構造配列
最悪計算時間 O ( n 2 ) {\displaystyle O(n^{2})}
最良計算時間 O ( n ) {\displaystyle O(n)}
平均計算時間 O ( n 2 ) {\displaystyle O(n^{2})}
最悪空間計算量 O ( 1 ) {\displaystyle O(1)} auxiliary

バブルソート(: bubble sort)は、隣り合う要素の大小を比較しながら整列させるソートアルゴリズム。

アルゴリズムが単純で実装も容易である一方、最悪時間計算量O(n2) と遅いため、一般にはマージソートヒープソートなど、より最悪時間計算量の小さな(従って高速な)方法が利用される。

また、安定内部ソートであり、並列計算との親和性が高いという利点もある。

基本交換法、隣接交換法[1]あるいは単に交換法とも呼ばれる。「バブルソート」という呼称自体はケネス・アイバーソンの1962年の著書 “A Programming Language” に由来すると考えられる[2]
アルゴリズムバブルソートにおける要素の移動例を示した図

全ての要素に関して、隣接する要素と比較し順序が逆であれば入れ替える。これを要素数-1回繰り返すことでソートを行う。なおこの繰り返しは、入れ替えが起こらなくなった時点で(それ以降は何度繰り返しても変化が起こらなくなるので)中断することができる。

この「全ての要素に関して」において、全ての要素に関して比較交換が行なわれるならば順序を問わない特徴を持つ(安定ソート)。この特徴により、比較交換順序を調整することで効率化されたアルゴリズムが多数派生している。そのため他の様々なソートアルゴリズムの基礎として一度は学ばされるアルゴリズムとなっている。

例えば前記の特徴によりバブルソートは並列処理と親和性が高く、比較交換器を潤沢に用いることで比較交換順序を調整したハードウェア実装では時間計算量はO(n)になる。この並列処理向けに比較交換順序を調整したアルゴリズムとして奇偶転置ソートがある。

また特にソフトウェアで実装される場合には一般に先頭から順に順次処理されるものなので、逆に先頭から順に順次処理されることを利用して不要なことが自明な比較交換をしないように効率化することは有効かつ直感的であり、この効率化されたアルゴリズムをもってバブルソートと呼ぶ場合もある。さらに、比較交換順序を逆順にすることで自明な比較交換を検出し易くしたアルゴリズムに挿入ソートがあり、効率化されたバブルソートは簡単な変更で容易に挿入ソートにできることから、ソートのソフトウェア実装としてバブルソートを選択する根拠はなく、学習専用の非効率的なアルゴリズムと考えられているのが現状である。

なお、係る派生したアルゴリズムが隣接する要素と比較交換以外の比較や交換を行なうことで効率化を図っている場合、安定という特徴を失う。

以下では、前記の自明な比較交換をしないように効率化されたバブルソートに関して解説する。

要素の1番目と2番目を比較し、順番が逆であれば入れ換える。次に2番目と3番目を比較して入れ換える。これを最後まで行うと、最後の数だけが最小または最大の数として確定するので、確定していない部分について1つずつ減らしながら繰り返す。procedure bubbleSort( A : list of sortable items ) defined as: for each i in 1 to length(A) - 1 do: for each j in 2 to length(A) - i + 1 do: if A[ j ] < A[ j - 1 ] then swap( A[ j ], A[ j - 1 ] ) end if end for end forend procedure



動作例要素の入替え例
初期データ: 6 5 3 1 8 7 2 4

初期データ: 8 4 3 7 6 5 2 1
 結果が確定した部を太字でしめすと、43765218(1回目の外側ループ終了時 交換回数:7)
34652178(2回目の外側ループ終了時 交換回数:5)
34521678(3回目の外側ループ終了時 交換回数:3)
34215678(4回目の外側ループ終了時 交換回数:2)
32145678(5回目の外側ループ終了時 交換回数:2)
21345678(6回目の外側ループ終了時 交換回数:2)
12345678(7回目の外側ループ終了時 交換回数:1)

交換回数の合計:7+5+3+2+2+2+1=22
解析ランダム配列数のバブルソートの例

「比較回数」は、高々n(n-1)/2回。交換回数は、元のデータ列によって異なるが、一回のスキャンで平均n/2回なので、全体では平均n(n-1)/4回。(O(n2))

バブルソートでは、大きな数が列の始めに位置していても問題ないが、右図のように列の後のほうに位置している小さな数は列の始めのほうに移動してくるのに時間がかかる。(上述の動作例中の"1"がまさにそのパターン)これを改良するために、シェーカーソートコムソートが提案された。
脚注[脚注の使い方]
出典^ バブルソートの意味(出典:デジタル大辞泉)
^ Astrachan, Owen (2003-01-11). “Bubble Sort -- An Archaelogical Algorithmic Analysis”. ACM SIGCSE Bulletin 35 (1): 1–5. doi:10.1145/792548.611918. .mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation.cs-ja1 q,.mw-parser-output .citation.cs-ja2 q{quotes:"「""」""『""』"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free a,.mw-parser-output .citation .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited a,.mw-parser-output .id-lock-registration a,.mw-parser-output .citation .cs1-lock-limited a,.mw-parser-output .citation .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription a,.mw-parser-output .citation .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:#d33}.mw-parser-output .cs1-visible-error{color:#d33}.mw-parser-output .cs1-maint{display:none;color:#3a3;margin-left:0.3em}.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}ISSN 0097-8418. 

関連項目.mw-parser-output .side-box{margin:4px 0;box-sizing:border-box;border:1px solid #aaa;font-size:88%;line-height:1.25em;background-color:#f9f9f9;display:flow-root}.mw-parser-output .side-box-abovebelow,.mw-parser-output .side-box-text{padding:0.25em 0.9em}.mw-parser-output .side-box-image{padding:2px 0 2px 0.9em;text-align:center}.mw-parser-output .side-box-imageright{padding:2px 0.9em 2px 0;text-align:center}@media(min-width:500px){.mw-parser-output .side-box-flex{display:flex;align-items:center}.mw-parser-output .side-box-text{flex:1}}@media(min-width:720px){.mw-parser-output .side-box{width:238px}.mw-parser-output .side-box-right{clear:right;float:right;margin-left:1em}.mw-parser-output .side-box-left{margin-right:1em}}ウィキメディア・コモンズには、バブルソートに関連するカテゴリがあります。










ソート
理論

計算複雑性理論

ランダウの記号

全順序

リスト

安定性

ソーティングネットワーク

比較ソート(英語版)

整数ソート(英語版)

交換ソート

バブルソート

シェーカーソート

奇偶転置ソート

コムソート

ノームソート

クイックソート

選択ソート

選択ソート

ヒープソート

スムースソート

デカルト木ソート

トーナメントソート

挿入ソート

挿入ソート

シェルソート

ツリーソート

図書館ソート

ペイシェンスソート

マージソート

マージソート

多層マージソート

ストランドソート

非比較ソート

基数ソート

バケットソート

計数ソート

プロキシマップソート

鳩の巣ソート

バーストソート

ビーズソート

並行ソート

バイトニックソート

バッチャー奇偶マージソート

シェアソート

混成ソート

ティムソート

イントロソート

Jソート

アンシャッフルソート(英語版)

その他

トポロジカルソート


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:13 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef