noldor's diary

調べたことのメモとよしなしごと

第1回 バブルソート

10番煎じぐらいな気がしなくもないですが、PHPでアルゴリズムのお勉強です。
初回はおなじみバブルソートバブルソートそのものの解説はwikipediaでどうぞ

<?php

function bubble_sort(&$array)
{
  $count = count($array);
  for ($n = $count - 1; $n > 0; $n--) {    // $n はソート対象範囲の最大
    for ($i = 0; $i < $n; $i++) {          // $i はソートのポインタ
      // ポインタの数値がポインタ右側より大きければ入れ替える。
      if ($array[$i] > $array[$i+1]) {
        $temp = $array[$i];
        $array[$i]   = $array[$i+1];
        $array[$i+1] = $temp;
      }
    }
    echo join(', ', $array) . "\n";
  }
}

$input = array(5, 2, 4, 3, 4, 8, 7, 2, 1);
echo '処理前:' . join(', ', $input) . "\n";
echo "処理中...\n";
bubble_sort($input);
echo '処理後:' . join(', ', $input) . "\n";

出力結果は以下。

処理前:5, 2, 4, 3, 4, 8, 7, 2, 1
処理中...
2, 4, 3, 4, 5, 7, 2, 1, 8
2, 3, 4, 4, 5, 2, 1, 7, 8
2, 3, 4, 4, 2, 1, 5, 7, 8
2, 3, 4, 2, 1, 4, 5, 7, 8
2, 3, 2, 1, 4, 4, 5, 7, 8
2, 2, 1, 3, 4, 4, 5, 7, 8
2, 1, 2, 3, 4, 4, 5, 7, 8
1, 2, 2, 3, 4, 4, 5, 7, 8
処理後:1, 2, 2, 3, 4, 4, 5, 7, 8

一番単純なソートアルゴリズムですが、実際にはこれではなく「クイックソート」が使われることが多いです。PHPのsort()関数もクイックソートで実装されています。というわけで次回はクイックソートです。