Javaで学ぶコムソート(Comb Sort)の実装方法とサンプルコード
コムソートとは
コムソート(Comb Sort)は、バブルソートを改良したソートアルゴリズムです。リストの後方に残りやすい小さな値(通称「ウミガメ」と呼ばれる要素)を効率的に手前に移動させ、転倒(順序が逆になっているペア)を一つずつ解消していきます。
バブルソートとの最大の違いは、隣接する要素だけでなく、一定の間隔(ギャップ)を空けた要素同士を比較する点です。このギャップを毎回約1.3倍の比率で縮小していくことで、ソートの効率が大幅に向上します。
Javaによる実装例
それでは、実際のコードを見てみましょう。
import java.util.Arrays;
public class Demo{
void comb_sort(int nums[]){
int len_gap = nums.length;
float shrink_val = 1.3f;
boolean swap = false;
while (len_gap > 1 || swap) {
if (len_gap > 1) {
len_gap = (int)(len_gap / shrink_val);
}
swap = false;
for (int i = 0; len_gap + i < nums.length; i++){
if (nums[i] > nums[i + len_gap]) {
swap(nums, i, i + len_gap);
swap = true;
}
}
}
}
private static void swap(int nums[], int x, int y) {
Integer temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
public static void main(String args[]){
Demo ob = new Demo();
int nums[] = {6, 78, 90, -12, -45, 0, -1, 45};
System.out.println("The original array contains ");
System.out.println(Arrays.toString(nums));
ob.comb_sort(nums);
System.out.println("The sorted array is ");
System.out.println(Arrays.toString(nums));
}
}実行結果
The original array contains [6, 78, 90, -12, -45, 0, -1, 45] The sorted array is [-45, -12, -1, 0, 6, 45, 78, 90]
コードの解説
comb_sortメソッドの仕組み
Demoクラス内には「comb_sort」メソッドが定義されています。まず配列の長さを初期ギャップとして取得し、その値が1より大きい間は、長さを縮小係数「1.3f」で割った値を新しいギャップ「len_gap」として設定します。
次に配列を先頭から走査し、「i番目の要素」と「i + len_gap番目の要素」を比較します。前者が大きければswapメソッドを使って両者を交換し、交換が発生したことを示すフラグを立てます。ギャップが1まで縮小すると、実質的にはバブルソートと同じ動作になり、交換が一切発生しなくなった時点でソート完了となります。
mainメソッドの流れ
mainメソッドでは、負の値を含む整数配列を用意し、Arrays.toString()で元の配列の内容を出力します。その後、Demoクラスのインスタンスを生成してcomb_sortメソッドを呼び出し、ソート後の配列を再び出力しています。実行結果から、昇順に正しく整列されていることが確認できます。
計算量の目安
コムソートの平均計算量は O(n log n) 程度とされ、最悪の場合でも O(n²) よりはるかに良好な性能を発揮します。追加のメモリ領域をほとんど必要としないインプレースなアルゴリズムである点も大きな特徴です。
-
Pythonでカウントソートを実装する方法|サンプルコード付きで解説
この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文 問題: 配列が与えられたとき、カウントソート(Counting Sort)のアルゴリズムを用いて、その配列を昇順に並べ替えます。 カウントソートとは? カウントソートは、あらかじめ決められた範囲内のキーを対象として動作する整列アルゴリズムです。まず、それぞれ異なるキー(値)を持つ要素がいくつあるかを数え上げます。その後、累積和の計算を行うことで、各要素がソート後の配列のどの位置に配置されるべきかを求め、結果を出力します。 この手法は、キーの取り得る範囲が狭い場合に特に有効で、時間計算量は O(n + k)(n は要素数
-
Pythonで学ぶ挿入ソート(Insertion Sort)の仕組みと実装方法
この記事では、Python 3.xにおける挿入ソート(Insertion Sort)の基本的な考え方と、実際のコードによる実装方法をわかりやすく解説します。 挿入ソートのアルゴリズム 挿入ソートは、配列を「整列済みの部分」と「未整列の部分」に分け、未整列の要素を一つずつ取り出して、整列済み部分の正しい位置に挿入していくシンプルなソート手法です。処理の手順は以下の通りです。 1. 各反復ごとに整列済みの配列を少しずつ拡大しながら、入力要素を走査する。 2. 現在の要素(キー)を、整列済み配列内の最大値と比較する。 3. キーがその最大値より大きければ、要素はそのままの位置に置かれ、 次の要