【C++】選択ソートのアルゴリズムと実装コードをわかりやすく解説
選択ソート(Selection Sort)は、シンプルで理解しやすいソートアルゴリズムの一つです。この手法では、リストを「ソート済みの部分」と「未ソートの部分」の2つの領域に分けて扱います。
まず、未ソートの領域から最大値(または最小値)を探し出します。ここでは最小値を基準に説明します。最小値が見つかったら、未ソート部分の先頭にあるデータと入れ替えることで、その値をリストの先頭へ移動します。この処理を1回行うごとにソート済みの領域が1つずつ拡大していき、最終的にリスト全体が昇順に並べ替えられます。
選択ソートの計算量
時間計算量:O(n2)
空間計算量:O(1)
選択ソートは追加のメモリをほとんど必要としない一方で、要素数が増えると比較回数が要素数の2乗に比例して増加するため、大規模なデータには不向きです。また、同じ値の相対的な順序が保持されない「非安定ソート」である点にも注意が必要です。
入力 − ソートされていないリスト: 5 9 7 23 78 20 出力 − ソート後の配列: 5 7 9 20 23 78
アルゴリズム
selectionSort(array, size)
入力:データの配列と、配列内の要素の総数
出力:ソート済みの配列
Begin
for i := 0 to size-2 do //i番目以降の範囲から最小値を探す
iMin := i;
for j := i+1 to size-1 do
if array[j] < array[iMin] then
iMin := j
done
array[i] と array[iMin] を入れ替える
done
End
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 selectionSort(int *array, int size) {
int i, j, imin;
for(i = 0; i<size-1; i++) {
imin = i; //最小値のインデックスを取得
for(j = i+1; j<size; j++)
if(array[j] < array[imin])
imin = j;
//最小値を正しい位置へ配置
swap(array[i], array[imin]);
}
}
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);
selectionSort(arr, n);
cout << "Array after Sorting: ";
display(arr, n);
}
このプログラムでは、まず要素数と各要素の値を入力として受け取り、ソート前の配列を表示します。その後、selectionSort()関数で選択ソートを実行し、ソート後の配列を出力します。
実行結果
Enter the number of elements: 6 Enter elements: 5 9 7 23 78 20 Array before Sorting: 5 9 7 23 78 20 Array after Sorting: 5 7 9 20 23 78
-
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] を、ピボットより小さいグループと大きい