データ構造のソート(並べ替え)アルゴリズム徹底比較:計算量と分類の基礎
ソート(並べ替え)アルゴリズムには200種類以上の手法が存在します。本記事では、その中から代表的な手法を厳選し、それぞれの特徴や時間計算量を比較して解説します。ソートの手法は、大きく分けて「比較ベースのソート」と「非比較ベースのソート」の2つに分類できます。
比較ベースのソートとは
バブルソート、選択ソート、挿入ソート、マージソート、クイックソート、ヒープソートなどが、代表的な比較ベースのソートです。これらが「比較ソート」と呼ばれる理由は、要素同士の値を比較しながら、複数のフェーズ(パス)を経て順番に並べていく仕組みだからです。以下の表に、各アルゴリズムの時間計算量をまとめました。
| 解析の種類 | バブルソート | 選択ソート | 挿入ソート | マージソート | クイックソート | ヒープソート |
|---|---|---|---|---|---|---|
| 最良ケース | O(n2) | O(n2) | O(n) | O(n log n) | O(n log n) | O(n log n) |
| 平均ケース | O(n2) | O(n2) | O(n2) | O(n log n) | O(n log n) | O(n log n) |
| 最悪ケース | O(n2) | O(n2) | O(n2) | O(n log n) | O(n2) | O(n log n) |
非比較ベースのソートとは
一方、基数ソート(ラディックスソート)、バケットソート、計数ソート(カウンティングソート)などは、非比較ベースのアルゴリズムに分類されます。これらは、ソートの過程で2つの要素を直接比較することなく並べ替えを行う点が大きな特徴で、比較ソートとは仕組みが根本的に異なります。以下に、解析の種類ごとの計算量の違いを示します。
| 解析の種類 | 基数ソート (kは最大桁数) | 計数ソート (kはカウント配列のサイズ) | バケットソート (kはバケットの数) |
|---|---|---|---|
| 最良ケース | O(nk) | O(n + k) | O(n + k) |
| 平均ケース | O(nk) | O(n + k) | O(n + k) |
| 最悪ケース | O(nk) | O(n + k) | O(n2) |
その他の観点からのソート分類
インプレースソートとアウトオブプレースソート
ソートアルゴリズムは、追加のメモリ使用量によっても分類できます。ソート処理のために余分な記憶領域を必要としないものは「インプレース(in-place)ソート」と呼ばれます。クイックソートやヒープソートがその代表例です。一方、マージソートは統合時に一時的な作業配列が必要となるため、「アウトオブプレース(out-place)ソート」に分類されます。
オンラインソートとオフラインソート
また、ソート処理の実行中に新しい要素を受け入れられるかどうかという観点もあります。処理の途中で新たな要素を追加し、それを適切な位置に組み込めるアルゴリズムは「オンラインソート」と呼ばれます。前述の手法の中では、挿入ソートがオンラインソートの代表例です。
まとめ
このように、ソートアルゴリズムは時間計算量だけでなく、メモリ効率や逐次的な入力への対応可否など、さまざまな観点から評価できます。データ量やメモリ制約、入力の与えられ方などの条件に応じて、最適なアルゴリズムを使い分けることが重要です。
-
データ構造入門:最小全域木(Minimum Spanning Tree)とは
全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit
-
データ構造における二分木の表現方法|配列と連結リストの違いを解説
コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520