(1)選択ソート

SortとMergeについて(1)選択ソート

Sort(データを特定の規則で並べる)と Merge(Sort済データを統合する)はプログラミングの基礎的なロジックです。
Sortの機能はほとんどの言語に用意されていますので、あえてコードを書く必要はないかもしれませんが、そのロジックを理解しておくことは無駄ではないと思います。Mergeはデータがソート済であることが前提なので、先ず基本的な6種類のソートをご紹介したいと思います。

1.基本的なソート

  • 選択ソート
    未ソートの中から最小(最大)値を検索して先頭から順番に並び替えていく。
  • バブルソート
    両隣のデータを比較して順序が逆なら入れ替える。
    先頭から作業をした場合は、最後尾から順番に最小(最大)値が押しやられる。
  • 挿入ソート
    ソート済データ(最初は1件)の中に未ソートのデータを適切な位置に挿入していく。
  • マージ&ソート
    データを半分に分割し、再帰的に小さくしていき、十分小さくなったらMerge(統合)する。
  • クイックソート
    基準値を設定しその値より大きいグループと小さいグループに分ける作業を再帰的に繰り返す。
  • ヒープソート
    データを2分木の構造(親の下に子が最大2つあるツリー構造)に配置し、下の階層から ヒープ条件(親 >= 子、又は、親<=子)を満たすように調整すると、最上位の階層の親(ルートノード)に、最大(小)値が移動するので、その後は、最大(小)値を末尾と交換し、残りを再びヒープ化する作業を繰り返す。

    次にそれぞれのソート方法をもう少し詳しく説明します。

2.選択ソート

基準値とそれ以降の未ソートのデータを順番に比較して、小さい(大きい)データを基準値と入れ替える作業を最後まで繰り返すと、基準値が最小(最大)値がとなります。基準値の位置を順番にずらしていき、最後に到達すれば完了です。
下図は配列に格納されたデータを、二つのインデックスで回しながらソートしていく様子です。
配列の番号は’0’から起算する言語が多いですが、ここでは’1’から起算しています。

フローチャートは下記のようになります。

選択ソートは最もわかりやすいロジックだと思いますが、データ量が多いと時間がかかります。
また、同じ値を持つデータがあると、もともとの並びと逆になる可能性があるので注意が必要です。

因みに、フロー図の判断記号の出口の条件は統一したほうが見やすいです。
例えば、Yesは下、Noは右などです。
また、比較の条件は´等号´ではなく、’以上’、’以下’ にする方が安全です。
ちょっと分かり難くはなりますが、バグによる無限ループに陥る可能性を減らせます。

次回は、バブルソートをご説明します。