C++で挿入ソートを実装する方法|アルゴリズムとサンプルコードを徹底解説
挿入ソートは、トランプの手札を並べ替えるときの動きに似ているソートアルゴリズムです。カードを整理するときと同じように、データセットから1つの要素を取り出し、その要素を挿入できる適切な位置を作るために他の要素をずらしてから、元の位置に戻すという手順を繰り返します。
挿入ソートの計算量
時間計算量:最良ケースは O(n)、平均ケースおよび最悪ケースは O(n²)
空間計算量:O(1)
入力 − ソート前のリスト:9 45 23 71 80 55 出力 − ソート後の配列:9 23 45 55 71 80
アルゴリズム
insertionSort(array, size)
入力:データの配列と、配列内の要素の総数
出力:ソート済みの配列
Begin
for i := 1 to size-1 do
key := array[i]
j := i
while j > 0 AND array[j-1] > key do
array[j] := array[j-1];
j := j – 1
done
array[j] := key
done
EndC++による実装例
以下は、挿入ソートをC++で実装したサンプルコードです。ユーザーから要素数と各要素を受け取り、ソート前後の配列を表示します。
#include<iostream>
using namespace std;
void display(int *array, int size) {
for(int i = 0; i<size; i++)
cout << array[i] << " ";
cout << endl;
}
void insertionSort(int *array, int size) {
int key, j;
for(int i = 1; i<size; i++) {
key = array[i];//値を取り出す
j = i;
while(j > 0 && array[j-1]>key) {
array[j] = array[j-1];
j--;
}
array[j] = key; //適切な位置に挿入
}
}
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);
insertionSort(arr, n);
cout << "Array after Sorting: ";
display(arr, n);
}実行結果
Enter the number of elements: 6 Enter elements: 9 45 23 71 80 55 Array before Sorting: 9 45 23 71 80 55 Array after Sorting: 9 23 45 55 71 80
このように、挿入ソートは実装がシンプルで、小規模なデータやほぼ整列済みのデータに対しては効率的に動作します。一方で、最悪ケースでは O(n²) の計算量となるため、大規模なデータセットにはクイックソートやマージソートなどの方が適しています。
-
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] を、ピボットより小さいグループと大きい