ノームソートのC++プログラム:仕組みと実装例をわかりやすく解説
ノームソート(Gnome Sort)は、挿入ソートによく似たソーティングアルゴリズムの一つです。ただし、要素を本来あるべき位置へ移動させる方法として、バブルソートと同じように「隣接する要素の一連の交換(スワップ)」を用いる点が特徴となっています。
入力: 53421 出力: 12345
アルゴリズムの解説
ノームソートでは、隣接する2つの要素を比較し、順序が崩れている場合にはそれらを交換しながら、各要素を徐々に正しい位置へ移動させていきます。複雑なデータ構造や再帰処理を必要とせず、単純なループだけで実装できるシンプルさが魅力のアルゴリズムです。
動作の流れ
- 先頭から順に、隣り合う2つの要素を比較します。
- 順序が正しければ、インデックスを1つ先へ進めます。
- 順序が誤っていれば、2つの要素を交換し、インデックスを1つ後ろへ戻します。
- これを配列全体が昇順に整列されるまで繰り返します。
最悪時・平均時の計算量は O(n²)、すでに整列済みのデータに対しては O(n) と効率よく動作します。小規模なデータや学習用途に適したアルゴリズムと言えるでしょう。
C++による実装例
#include <iostream>
using namespace std;
int main() {
int temp;
int arr[] = { 5, 3, 4, 2, 1 };
int n = 5;
int i;
i = 0;
while (i < n) {
if (i == 0 || arr[i - 1] <= arr[i])
i++;
else {
temp = arr[i - 1];
arr[i - 1] = arr[i];
arr[i] = temp;
i = i - 1;
}
}
for (i = 0; i < n; i++) {
cout << arr[i] << "\t";
}
}このプログラムを実行すると、配列 {5, 3, 4, 2, 1} が昇順に並べ替えられ、「1 2 3 4 5」と出力されます。コードの構造が非常に単純なので、ソートアルゴリズムの入門としても理解しやすいのがポイントです。
-
C++で基数ソート(ラディックスソート)を実装するプログラム
基数ソート(ラディックスソート)は、非比較型のソートアルゴリズムの一つです。要素同士を直接比較するのではなく、整数キーを構成する各桁に注目し、同じ桁位置・同じ値を持つ数字どうしをグループ化しながら並べ替えを行います。 「基数」とは記数法における底のことです。私たちが普段使う10進法では基数は10であるため、10進数を基数ソートで並べ替える際には、数値を一時的に格納するための10個のバケット(ポケット)が必要になります。 基数ソートの計算量 時間計算量: O(nk) ※nは要素数、kは最大桁数 空間計算量: O(n+k) 入力 − ソート前のデータ: 802 630 20 745 52 3
-
C++でシェーカーソートを実装する方法|アルゴリズムとサンプルコード解説
シェーカーソートとは シェーカーソート(Shaker Sort)は、与えられたデータを昇順に並べ替えるためのソートアルゴリズムの一つです。バブルソートとよく似ていますが、決定的に異なるのは配列を双方向(往復)に走査して整列を進める点です。「カクテルソート」「双方向バブルソート」と呼ばれることもあります。このアルゴリズムの最悪計算量は O(n²) です。 アルゴリズムの手順 開始 ShakerSort() 関数は、引数としてデータ配列 arr と要素数 n を受け取る。 // ネストした for ループを使ってソートを実装する。 外側のループは i を 0 から n-1 まで回し、