Java 配列の要素を並び替える - 単純交換法(バブルソート)
Javaで配列の要素を単純交換法(バブルソート)によって並べ替える方法です。
バブルソート( bubble sort ) とは、ソートのアルゴリズムの一つです。隣り合う要素の大小を比較しながら整列させますが、計算が遅いことが難点です。
ここでは Javaで配列の要素を単純交換法(バブルソート)によって並べ替える方法 を紹介します。
目次
単純交換法(バブルソート)の特徴
単純交換法(バブルソート)の特徴は下記のようになります。
- アルゴリズムが単純なこと
- 安定した内部ソートであること
- 実装が容易なこと
これらの理由から学習用に利用されることが多いです。
基本交換法、隣接交換法とも言われ、単に交換法と言う場合もあります。
サンプルソース
それではサンプルソースを見ながら説明していきます。
/**
* 指定された int 配列を、単純交換法(バブルソート)によって並べ替えを実施し、配列を返します。
*
* @param values 基となる int 配列
* @return 単純交換法(バブルソート)による並べ替え後の int 配列
*/
public static int[] bubbleSort(final int[] values) {
int[] vals = values;
if ( vals == null || vals.length == 0 ) return vals;
int temp=null;
// 単純交換法による並べ替え
for ( int i = 0; i < vals.length - 1; i++ ) {
for ( int j = vals.length - 1; j > i; j-- ) {
if ( vals[j - 1] > vals[j] ) {
temp = vals[j - 1];
vals[j - 1] = vals[j];
vals[j] = temp;
}
}
}
return vals;
}
/**
* 指定された int 配列の最大値を返します。</p>
*
* @param values 基となる int 配列
* @return 10 進数の引数で表される整数値。 引数が null の場合は -1 を返します。
*/
public static int bubbleSortMax(final int[] values) {
if ( values == null || values.length == 0 ) return -1;
int[] vals = bubbleSort(values);
// 最大値を返す
return vals[vals.length - 1];
}
/**
* 指定された int 配列の最小値を返します。
*
* @param values 基となる int 配列
* @return 10 進数の引数で表される整数値。 引数が null の場合は -1 を返します。
*/
public static int bubbleSortMin(final int[] values) {
if ( values == null || values.length == 0 ) return -1;
int[] vals = bubbleSort(values);
// 最小値を返す
return vals[0];
}
bubbleSortメソッド
引数が null
もしくは、要素数が 0 の場合は、そのまま引数を返しています。
if ( vals == null || vals.length == 0 ) return vals;
全ての要素に関して、隣接する要素と比較し、順序が逆であれば入れ替えています。
これを要素数 -1 回繰り返すことでソートを行なっています。
for ( int i = 0; i < vals.length - 1; i++ ) {
for ( int j = vals.length - 1; j > i; j-- ) {
if ( vals[j - 1] > vals[j] ) {
temp = vals[j - 1];
vals[j - 1] = vals[j];
vals[j] = temp;
}
}
}
bubbleSortMaxメソッド
バブルソートにより配列内の最大値を取得します。
bubbleSortMinメソッド
バブルソートにより配列内の最小値を取得します。
テストしてみる
それではテストを実施してみましょう。
SortUtils
というクラスを作って
以下のようなテストコードを作りました。
public static void main(String[] args) {
int values[] = {1,10,1,13,111,2250,1234,567,0,21,-33121,-40};
int x[] = SortUtils.bubbleSort(values);
String ot = "";
String sepa = "";
for ( int i = 0; i < x.length; i++ ) {
ot += sepa + x[i];
sepa = ", ";
}
System.out.println("####### バブルソート 配列 要素有り #########");
System.out.println("ソート: " + ot);
System.out.println("最大値(x): " + SortUtils.bubbleSortMax(values));
System.out.println("最小値(x): " + SortUtils.bubbleSortMin(values));
int y[] = {};
System.out.println("####### バブルソート 配列 要素無し #########");
System.out.println("最大値(y): " + SortUtils.bubbleSortMax(y));
System.out.println("最小値(y): " + SortUtils.bubbleSortMin(y));
int z[] = null;
System.out.println("####### バブルソート 配列 null #########");
System.out.println("最大値(z): " + SortUtils.bubbleSortMax(z));
System.out.println("最小値(z): " + SortUtils.bubbleSortMin(z));
}
テスト結果を確認
それでは結果を見てみましょう。
バブルソート 配列 要素有り
「バブルソート 配列 要素有り」の場合、配列内が正常にソートされていますね。最大値と最少値も問題なく取得できました。
####### バブルソート 配列 要素有り #########
ソート: -33121, -40, 0, 1, 1, 10, 13, 21, 111, 567, 1234, 2250
最大値(x): 2250
最小値(x): -33121
バブルソート 配列 要素無し
「バブルソート 配列 要素無し」の場合、配列の要素がありませんので、最大値・最小値に -1 が返されています。
####### バブルソート 配列 要素無し #########
最大値(y): -1
最小値(y): -1
バブルソート 配列 null
「バブルソート 配列 null」の場合、配列の要素がありませんので、最大値・最小値に -1 が返されています。
####### バブルソート 配列 null #########
最大値(z): -1
最小値(z): -1
まとめ
Javaで配列の要素を単純交換法(バブルソート)によって並べ替える方法を紹介しました。
いかがでしたでしょうか。ソートのアルゴリズムが少しでも理解できたならうれしいです。
他にも、ここでは紹介しきれないほど様々なソートのアルゴリズムが存在していますので、興味のある方は調べてみてください。
おつかれさまでした。