MAGAZINE

キャリテク!マガジン

コラム

整列アルゴリズム

こんにちは。小澤です。

今回からは、アルゴリズムについて解説します。

アルゴリズムは、問題を解決するための手順や方法であり、プログラミングにおける基本的な概念です。具体的には、整列アルゴリズムや探索アルゴリズムなどがあります。

整列アルゴリズムは、データを正しい順序に並べ替えるための手法であり、探索アルゴリズムは、特定の値を見つけるための手法です。

同じ問題を解決するにも、複数のアルゴリズムが存在します。
例えば、整列アルゴリズムには、バブルソート、選択ソート、挿入ソートなどの手法があります。
アルゴリズムにはそれぞれ特徴や利点があるので、その効率性や安定性を理解して、要件やデータセットに合致する最適なアルゴリズムを選択するようにしましょう。

また、それぞれのアルゴリズムには、比較回数や交換回数、計算量などの指標があるので、参考にするとよいでしょう。

整列アルゴリズム

整列(ソート)は、データをある基準に従って並べ替える操作です。
整列アルゴリズムには、バブルソート、選択ソート、挿入ソート、シェルソート、クイックソート、ヒープソート、マージソートなどが存在します。

基本情報技術者試験では、擬似言語を使用したアルゴリズムの問題が出題されることもあります。
アルゴリズムの擬似言語での実装に慣れておくことも必要です。

今回は、「バブルソート」、「選択ソート」、「挿入ソート」、「シェルソート」の4つの整列アルゴリズムを取り上げます。

これらのアルゴリズムについては、『徹底攻略 基本情報技術者試験教科書 令和5年度』の「2−10 整列アルゴリズム(118ページから123ページ)」でも詳しく説明されています。

なお、クイックソート、ヒープソート、マージソートについては、次回説明することにします。

バブルソート(基本交換法)

バブルソートは、隣り合う要素を比較し、順序が逆であれば交換する操作を繰り返すアルゴリズムです。

要素を「バブルアップ(浮かび上がらせる)」というイメージで並べ替えます。
一番大きな要素が確定し、次に二番目に大きな要素が確定するというプロセスを繰り返し、最終的にリスト全体が整列します。

バブルソートは、もともとの要素の配置に関係なく隣接する要素を比較するため、要素数に対して二重ループを回す必要があります。

つまり、要素数がnの場合、n(n-1)/2回の比較が発生します。

バブルソートは単純なアルゴリズムで、理解しやすいのですが、大規模なデータセットでは効率が悪いため、実務ではあまり使用されません。

擬似言語による実装は以下です。

ここで、A[j]とA[j+1]の値を交換する処理では、一時的な変数を使用して値を退避させる必要があることを理解しておきましょう。

なお、二重ループとなっている箇所は、教科書では、

となっています。

これは、外側のループ「i」が、要素を後ろから逆順に比較しているもので、どちらも正しくソートはできます。

選択ソート(基本選択法)

選択ソートは、リスト内の要素を順番に比較し、最小値(または最大値)を選択し、それをソート済みの部分の末尾に追加する方法です。

要素を左から右に移動させながら、順々に入れ替えを繰り返します。

選択ソートでは、最小値を探すために、すべての要素を比較します。要素数がnの場合、最大で n(n-1)/2 回の比較が必要となります。

よって、選択ソートも、大規模なデータセットでは効率が悪いため、実務ではあまり使用されません。

擬似言語による実装は以下です。

挿入ソート(基本挿入法)

挿入ソートは要素を一つずつ取り出し、適切な位置に挿入して整列させるアルゴリズムです。

リスト内の各要素を、その前の要素と比較しながら、適切な位置に挿入していきます。

これにより、リストの左側は整列済みの部分となり、右側は未整列の部分となります。

挿入ソートでは、要素を挿入するたびに、それを挿入する位置までの要素と比較するため、平均的な場合は理論的には約 n^2 / 4 回の比較が行われます。

挿入ソートは、小さなデータセットでは効率的であり、特に部分的に整列されている場合には高速に動作しますが、大規模なデータセットには向いていません。

擬似言語による実装は以下です。

シェルソート(改良挿入法)

シェルソートは、先ほどの挿入ソートを改良した整列アルゴリズムです。

要素ごとに間隔を設定し、その間隔ごとに要素をグループ化し、各グループ内で挿入ソートを繰り返し実行します。

最初は大きな間隔から始まり、繰り返し処理を行うごとに間隔を縮小していきます。

最終的には間隔が1になり、通常の挿入ソートと同様の操作が行われます。

挿入ソートでの比較回数は、間隔の設定に大きく影響されます。

平均的な比較回数は、O(n^1.25) から O(n^1.5) の間にあります。

適切な間隔が使用された場合、O(n * log^2(n)) となりますが、最悪の場合は O(n^2) となり、劣るケースも出てきます。

シェルソートは、比較的高速なアルゴリズムで、中程度のデータセットに対しては有用なアルゴリズムです。

ただし、最適な間隔の選択が難しいので、実装においては検討が必要です。

挿入ソートよりは効率的ですが、最適な間隔を選択できないと、高い交換回数が必要となってしまいます。

擬似言語による実装は以下です。

まとめ

今回は、整列アルゴリズムのうち、「バブルソート」、「選択ソート」、「挿入ソート」、「シェルソート」の4つについて説明しました。

バブルソートは隣り合う要素を比較し、順序が逆であれば交換する操作を繰り返すアルゴリズムです。

一番大きな要素が確定し、次に二番目に大きな要素が確定するというプロセスを繰り返し、最終的にリスト全体が整列します。

ただし、大規模なデータセットでは効率が悪いため、実務ではあまり使用されません。

選択ソートは、リスト内の要素を順番に比較し、最小値(または最大値)を選択し、それをソート済みの部分の末尾に追加する方法です。

要素を左から右に移動させながら、順々に入れ替えを繰り返します。

このアルゴリズムも大規模なデータセットでは効率が悪いため、実務ではあまり使用されません。

挿入ソートは、要素を一つずつ取り出し、適切な位置に挿入して整列させるアルゴリズムです。

リストから取り出した要素を、その前の要素と比較しながら、適切な位置に挿入していきます。

小さなデータセットでは効率的ですが、これも大規模なデータセットには向いていません。

シェルソートは、挿入ソートを改良した整列アルゴリズムです。

間隔を設定し、その間隔ごとに要素をグループ化し、グループ内で挿入ソートを繰り返し実行します。

比較的高速なアルゴリズムですが、最適な間隔の選択が難しいため、実装においては検討が必要です。

関連記事

facebook シェアシェア
LINE シェアシェア