【Java】ノームソートの実装方法をサンプルコード付きでわかりやすく解説
ノームソート(Gnome Sort)は、一度に1つの要素に注目し、その要素を本来あるべき位置へ移動させていくシンプルなソートアルゴリズムです。隣接する要素を比較しながら必要であれば交換し、条件が満たされるまで戻りながら整列を進めるのが特徴で、その動作が「地精(ノーム)が花鉢を並べ替える様子」に似ていることからこの名前が付けられました。
ここでは、Javaでノームソートを実装する具体的な例を紹介します。
サンプルコード
import java.util.Arrays;
public class Demo{
static void gnome_sort(int my_arr[], int n){
int index = 0;
while (index < n){
if (index == 0)
index++;
if (my_arr[index] >= my_arr[index - 1])
index++;
else{
int temp = 0;
temp = my_arr[index];
my_arr[index] = my_arr[index - 1];
my_arr[index - 1] = temp;
index--;
}
}
return;
}
public static void main(String[] args){
int my_arr[] = { 34, 67, 89, 11, 0 , -21 };
gnome_sort(my_arr, my_arr.length);
System.out.println("The array after performing gnome sort on it is ");
System.out.println(Arrays.toString(my_arr));
}
}実行結果
The array after performing gnome sort on it is [-21, 0, 11, 34, 67, 89]
コードの解説
「Demo」という名前のクラス内に、staticメソッド「gnome_sort」が定義されています。まず、変数「index」に0を代入し、indexが配列の長さnより小さい間、以下の処理を繰り返します。
- indexが0の場合:比較対象となる前の要素が存在しないため、indexを1つ進めます。
- 現在の要素が前の要素以上の場合:順序が正しいと判断できるため、そのままindexを1つ進めます。
- 現在の要素が前の要素より小さい場合:一時変数「temp」を使って隣接する2つの要素を交換し、indexを1つ戻します。これにより、小さい要素が少しずつ左側へ移動していきます。
mainメソッドでは、34、67、89、11、0、-21という値を持つint型配列を定義し、その配列と長さを引数として「gnome_sort」メソッドを呼び出します。ソート完了後、Arrays.toString()メソッドを使用して、整列済みの配列をコンソールに出力します。
ノームソートの計算量
ノームソートの平均計算量および最悪計算量はO(n²)です。一方で、すでにソート済みの配列に対しては各要素を一度通過するだけで済むため、最良計算量はO(n)となります。実装が非常に簡単な反面、大規模なデータセットには不向きであり、学習用途や小規模データの整列に適したアルゴリズムといえます。
-
Pythonで実装するストゥージソート:アルゴリズムの手順とコード例を徹底解説
本記事では、ストゥージソート(Stooge Sort)を用いて配列を並べ替えるPythonプログラムの実装方法について解説します。 問題文 与えられた配列を、ストゥージソートというアルゴリズムを使って昇順に並べ替えることが課題です。 ストゥージソートとは ストゥージソートは、配列の一部を再帰的に繰り返しソートすることで全体を整列させる、非常にシンプルな比較ソートアルゴリズムです。計算量は O(nlog3/log1.5) ≒ O(n2.71) となり、バブルソートなどよりもさらに非効率ですが、再帰処理やアルゴリズム設計の仕組みを理解するための学習教材として知られています。 アルゴリズムの手順 1
-
Pythonで実装するノームソート:アルゴリズムの仕組みとサンプルコード
この記事では、ノームソート(Gnome Sort)と呼ばれるソートアルゴリズムについて学び、Pythonでの実装方法を解説します。問題定義与えられた配列(リスト)を、ノームソートのアルゴリズムを使って昇順に並べ替えることが目標です。ノームソートは、日常的な動作をモデル化した直感的なアルゴリズムです。庭の植木鉢を並べ替える「ノーム(小人)」の動きに例えられることから、この名前が付きました。バブルソートや挿入ソートに似た考え方に基づいています。アルゴリズムの手順1. 配列を左端から右端へ向かって走査する。 2. 現在の要素が前の要素以上であれば、そのまま1つ先へ進む。 3. 現在の要素が前の要素よ