C++でバブルソートを実装する方法をわかりやすく解説
バブルソート(Bubble Sort)は、比較ベースの基本的なソートアルゴリズムの一つです。隣り合う要素同士を比較し、順序が正しくない場合は入れ替えることを繰り返すことで、データ全体を昇順(または降順)に整列させます。
このアルゴリズムは他のソート手法と比べて実装が非常にシンプルであるという特徴がありますが、一方でいくつかの欠点も抱えています。特に大量のデータを扱う場合には処理に時間がかかるため、大規模なデータセットのソートには適していません。学習用や小規模データ向けのアルゴリズムとして理解しておくと良いでしょう。
バブルソートの計算量
時間計算量: 最良ケース O(n)、平均・最悪ケース O(n2)
空間計算量: O(1)
すでにソート済みの配列に対しては、スワップの有無を検知するフラグを利用することで、1回の走査で処理を終了でき、最良ケースでは線形時間 O(n) で完了します。
入力 − ソートされていないデータのリスト:56 98 78 12 30 51
出力 − ソート後の配列:12 30 51 56 78 98
アルゴリズム
bubbleSort(array, size)
入力: データの配列と、配列内の要素数
出力: ソート済みの配列
開始
for i := 0 to size-1 do
flag := 0;
for j := 0 to size - i - 1 do
if array[j] > array[j+1] then
array[j] と array[j+1] を交換
flag := 1
done
if flag ≠ 1 then
ループを抜ける。
done
終了
C++による実装例
以下は、バブルソートをC++で実装したサンプルコードです。ユーザーから要素数と各要素を受け取り、ソート前後の配列を表示します。
#include<iostream>
using namespace std;
void swapping(int &a, int &b) { // aとbの中身を入れ替える
int temp;
temp = a;
a = b;
b = temp;
}
void display(int *array, int size) {
for(int i = 0; i<size; i++)
cout << array[i] << " ";
cout << endl;
}
void bubbleSort(int *array, int size) {
for(int i = 0; i<size; i++) {
int swaps = 0; // スワップが発生したかを検知するフラグ
for(int j = 0; j<size-i-1; j++) {
if(array[j] > array[j+1]) { // 現在の要素が次の要素より大きい場合
swapping(array[j], array[j+1]);
swaps = 1; // スワップフラグをセット
}
}
if(!swaps)
break; // この走査でスワップなし → 配列はソート済み
}
}
int main() {
int n;
cout << "Enter the number of elements: ";
cin >> n;
int arr[n]; // 指定された要素数で配列を作成
cout << "Enter elements:" << endl;
for(int i = 0; i<n; i++) {
cin >> arr[i];
}
cout << "Array before Sorting: ";
display(arr, n);
bubbleSort(arr, n);
cout << "Array after Sorting: ";
display(arr, n);
}実行結果
上記のプログラムを実行すると、以下のような出力が得られます。6つの整数を入力した場合の例です。
Enter the number of elements: 6
Enter elements:
56 98 78 12 30 51
Array before Sorting: 56 98 78 12 30 51
Array after Sorting: 12 30 51 56 78 98
このように、入力された配列「56 98 78 12 30 51」が、昇順に整列された「12 30 51 56 78 98」へと変換されていることが確認できます。
-
C++で基数ソート(ラディックスソート)を実装するプログラム
基数ソート(ラディックスソート)は、非比較型のソートアルゴリズムの一つです。要素同士を直接比較するのではなく、整数キーを構成する各桁に注目し、同じ桁位置・同じ値を持つ数字どうしをグループ化しながら並べ替えを行います。 「基数」とは記数法における底のことです。私たちが普段使う10進法では基数は10であるため、10進数を基数ソートで並べ替える際には、数値を一時的に格納するための10個のバケット(ポケット)が必要になります。 基数ソートの計算量 時間計算量: O(nk) ※nは要素数、kは最大桁数 空間計算量: O(n+k) 入力 − ソート前のデータ: 802 630 20 745 52 3
-
C++でクイックソートを実装するプログラム|ランダム化で最悪ケースO(n²)を回避
クイックソート(Quick Sort)は「分割統治法(divide-and-conquer)」に基づく高速な整列アルゴリズムです。平均時間計算量は O(n log n) と非常に効率的ですが、ピボットの選び方次第では最悪ケースで O(n²) まで計算量が悪化する可能性があります。 そこで本記事では、乱数を用いてピボットをランダムに選択する「ランダム化クイックソート」をC++で実装し、最悪ケースが発生する確率を大幅に下げる方法を解説します。 アルゴリズム Partition(int a[], int l, int h) 配列 a の範囲 [l, h] を、ピボットより小さいグループと大きい