ソートアルゴリズム

 大容量のデータを扱う際に、データをある規則に準じて整列し格納されていることが多い。我々が通常目にする多くの種類のデータは、たいていそのようになっている。例えば、学生に関するデータは学籍番号順(五十音順)に並んで保管されている。図書館に行ってみても、蔵書目録カードは、書籍名の五十音順と著者名の五十音順に並べられている。さらに、病院のカルテの保管も生年月日順であったり、五十音順であったりする。このように、データをなんらかの目的に応じて、整列させていることがほとんどである。それは、データの検索や参照を考えると、より早い時間で目的のデータが得られ易いからである。
 このように、並べ換えの問題は我々にとって身近な問題である。ここでは、代表的な並べ換えの方法を紹介するとともに、プログラムの効率(アルゴリズムの速さ)について議論する。並べ換えを英語ではソート(sort)と呼ぶ。そのため、並べ換えのアルゴリズムをソーティングアルゴリズムと言う。
 

ソーティングアルゴリズムの種類と計算の手間

 トランプ(ハートマークのみ13枚)を1から順に整列させることを考えてみよう。ある人は、13枚手に持ちまず1を見つけそれを一番左に移動させ、次に2を見つけ左から2番目に移動させ、・・・を繰り返し、最後には1から順に並べることをするでしょう。ある人は、手にとったカードで隣会ったカードを比べ、大きい方を右へずらし、順次全てのカードに対して行なうことにより、並び換えるでしょう。またある人は、13枚床にばらまき1から順に拾って並べることをするでしょう。このように、カードの並べ換えの方法はいろいろ考えられるように、コンピュータを使ったデータの並べ換えにも多くの手法(アルゴリズム)が提案されている。代表的なものをまとめると、表1のようになる。
表1 ソーティングアルゴリズムの種類
   分類 | 低速アルゴリズム  |  高速アルゴリズム
 ===============================================================
  選択法 | 単純選択ソート   |  ヒープソート
  ---------------------------------------------------------------
    挿入法 | 単純挿入ソート   |  シェルソート(注意*1)
 ---------------------------------------------------------------
  交換法 | バブルソート    |  クイックソート
      | シェーカーソート  |
 ---------------------------------------------------------------
  併合法 |   −−−       |  マージソート
 ---------------------------------------------------------------
 注意*1:シェルソートを高速アルゴリズムに分類したが、計算量はO(n^1.2)であることが知られている。

 表1において低速、高速で分類しているが、アルゴリズムの速さとは実行に要する計算の手間である。理論計算機科学の分野では、この計算の手間を計算量(計算時間量)と呼び、アルゴリズムの計算量について多くの研究が行なわれている。この計算量はアルゴリズムの評価の第一の基準となっている。たとえ、どんなに簡単なアルゴリズムでも目的の結果が得られるまでに、何十年もかかってはまったく意味の無いものとなってしまう。
 ソーティングアルゴリズムについて言うと、低速アルゴリズムはO(n^2)、高速アルゴリズムはO(nlogn)に分類できる。O(オーダーもしくはビッグオー)とは、計算量を評価するときの単位で、対象とするデータの数nに比例して計算の手間が多くなることを意味する。ソーティングアルゴリズムの場合は、比較演算あるいは交換演算の回数が対象データの数の2乗もしくはnlognに比例して多くなる。例えば対象データの数を100倍すると、高速アルゴリズムでは約664倍(100*log2(100))に、低速アルゴリズムでは10000倍(100*100)になる。
 このように、データの数が多くなったときに与えたアルゴリズムが本当に有効なものなのかを知る手掛かりとして、計算量を評価することは重要なことである。一般にアルゴリズムの計算量を評価する方法として、

 1.データの大きさに対する平均計算時間の増加率が小さいほどよい,
 2.最悪ケースを考えた時のオーダーが小さいほどよい,
 3.計算時間の分散が少ないほどよい,
の順に評価することがよいとされている。
 アルゴリズムの優劣は、計算時間量の他にも、計算時の記憶域の少なさや、ステップ数、エレガントさなどがある。
 ここでは、いくつかのソーティングアルゴリズムを紹介するとともに、計算量の評価の仕方について学ぶ。

戻る

a93sj030@j.dendai.ac.jp