アルゴリズム+データ構造勉強会(2)の解答例とレビュー

第2回、バブルソートの解答例と修正です。
今回、広島県なみに「おしい」解答がありました。

    for ($i = 0; $i < count($array)-1; $i++) {
      for ($j = $i+1; $j < count($array); $j++) {
        if ($array[$i] > $array[$j]) {
          $cache     = $array[$i];
          $array[$i] = $array[$j];
          $array[$j] = $cache;
        }
      }
    }

ソートはされるのですが、「隣同士の比較」になっていないのです。動作確認ではなかなか検知不能ですが、不安定なソートになっています。「隣同士」を表現するために「$j」と「$j+1」を使ってみましょう。

    for ($i = 0; $i < count($array)-1; $i++) {
      for ($j = 0; $j < count($array)-1-$i; $j++) {
        if ($array[$j] > $array[$j+1]) {
          $cache       = $array[$j];
          $array[$j]   = $array[$j+1];
          $array[$j+1] = $cache;
        }
      }
    }

「$j+1」を使うために内側のループ初期値と条件を変更しています。