SlideShare a Scribd company logo
アルゴリズム+データ構造
    勉強会(2)
   2013-02-04 アロハ)竹腰 彰成
第1回 バブルソート
バブルソートの原理
• 配列上で隣り合うデータを比較し、入れ替える。これを繰り返す。

         3        2   4   1   5


             比較




         2        3   4   1   5
2   3        4        1        5   入れ替え不要


        比較



2   3        4        1        5   入れ替える


                 比較



2   3        1        4        5   入れ替え不要


                          比較



2   3        1        4        5   一番大きい値が右にきた
2        3        1        4   5   入れ替え不要


    比較



2        3        1        4   5   入れ替える


             比較



2        1        3        4   5   入れ替え不要


                      比較



2        1        3        4   5   一番大きい値が右にきた
2        1        3   4   5   入れ替える


    比較



1        2        3   4   5   入れ替え不要


             比較



1        2        3   4   5   一番大きい値が右にきた
1        2   3   4   5   入れ替え不要


    比較



1        2   3   4   5   一番大きい値が右にきた




1        2   3   4   5   1つだけになったので完了
バブルソートの計算量
• 計算量:𝑂(𝑛2 )
  • 5個の入れ替え→4個の入れ替え→3個→2個→1個
  • 入れ替え回数:(n-1)×(n-1)÷2(三角形の面積)
              1 2      1
            = 𝑛 − 𝑛 −
                   2       2

               2       3       1   4   5


               2       1       3   4   5


               1       2       3   4   5


               1       2       3   4   5
バブルソートの性質
• 安定なソート
 • 隣り合う左右の入れ替え
   =同値の時に入れ替えなければ同値同士の順番は変わらない
• 学習用
 • 単純だが計算量が大きい
 • 工夫を付け加えたものが用いられることはある
実習:バブルソートの実装
• 第1回の実習課題を書き換えて、バブルソートを実装してください。
 •   バブルソート関数bubble_sort()を作る
 •   ランダムなデータを配列に20個用意する
 •   ソート前データを表示する
 •   bubble_sort()でソートする
 •   ソート後のデータを表示する
• 勉強会の残り時間を使って書いてください。時間のある限り質問を
  受け付けます
• できあがったら提出してください
• 時間に間に合わない場合は宿題にします
sort()の置き換えの注意点
• sort($abc) は$abcの中身を直接書き換えているが、これから作る
  bubble_sort()関数でそれができるか?
  • 普通に作ると、引数を書き換えても呼び出し元の関数は変わらない
• 置き換えるには2つのアプローチがある
  • return でソート後の配列を返し、呼び出し元でそれを受け取るようにする
  • 「function bubble_sort(&$abc)」とすると、$abcを書き換えると呼び出し元の
    変数も書き換えられる。
• 前者を「call by value(値渡し)」、後者を「call by reference(参照渡
  し)」といいます。
• http://php.net/manual/ja/functions.arguments.php
今日の単語
• バブルソート
• call by value(値渡し)
• call by reference(参照渡し)

More Related Content

アルゴリズム+データ構造勉強会(2)