ゆるゆるプログラミング

・配列のソート

配列に格納されている値を大きい方から順番に、小さい方から順番に並び替えるプログラムを紹介します。

小さい値から大きい値に並び替えることを昇順ソートといいます。
例えば、{8,3,6,1,7}の昇順ソートは{1,3,6,7,8}です。

大きい値から小さい値に並び替えることを降順ソートといいます。
例えば、{8,3,6,1,7}の降順ソートは{8,7,6,3,1}です。

以下は、int型配列昇順ソートのプログラム例です。

Sort1.java ← クリックしてダウンロードページに移動
001:    import java.util.Arrays;
002:    
003:    public class Sort1 {
004:    	public static void main( String[] args ) {
005:    		// 配列aを宣言
006:    		int[] a;
007:    
008:    		// 要素数10を設定
009:    		a = new int[ 10 ];
010:    
011:    		// 値を代入
012:    		a[ 0 ] = 13;
013:    		a[ 1 ] =  3;
014:    		a[ 2 ] = 54;
015:    		a[ 3 ] =  1;
016:    		a[ 4 ] =  9;
017:    		a[ 5 ] = 99;
018:    		a[ 6 ] = 43;
019:    		a[ 7 ] = 21;
020:    		a[ 8 ] = 78;
021:    		a[ 9 ] = 19;
022:    
023:    		// 昇順ソート
024:    		Arrays.sort( a );
025:    
026:    		// 結果表示
027:    		for ( int i = 0; i < a.length; ++ i ) {
028:    			System.out.println( a[ i ] );
029:    		}
030:    	}
031:    }

Sort1の出力結果(昇順ソート)

1
3
9
13
19
21
43
54
78
99

この例では、Arraysクラスのsortメソッドを使って昇順ソートを行っています。

ソート Arrays.sortメソッド

public static int Arrays.sort( byte[] a )
public static int Arrays.sort( char[] a )
public static int Arrays.sort( double[] a )
public static int Arrays.sort( float[] a )
public static int Arrays.sort( int[] a )
public static int Arrays.sort( short[] a )
■指定された配列を数値の昇順でソートします。

  パラメータ a : 昇順ソートする配列

次に、int型配列降順ソートのプログラムの作り方を説明します。Arraysクラスのsortでint型配列降順ソートすることはできません。

そこで、Arraysクラス降順ソートできるIntegerクラス配列に、int型の値を一時的にコピーし、降順ソートの結果をint型に戻す方法を使っています。

以下は、int型配列降順ソートのプログラム例です。

Sort2.java ← クリックしてダウンロードページに移動
001:    import java.util.Arrays;
002:    import java.util.Collections;
003:    
004:    public class Sort2 {
005:    	public static void main( String[] args ) {
006:    		// 配列aを宣言
007:    		int[] a;
008:    
009:    		// 要素数10を設定
010:    		a = new int[ 10 ];
011:    
012:    		// 値を代入
013:    		a[ 0 ] = 13;
014:    		a[ 1 ] =  3;
015:    		a[ 2 ] = 54;
016:    		a[ 3 ] =  1;
017:    		a[ 4 ] =  9;
018:    		a[ 5 ] = 99;
019:    		a[ 6 ] = 43;
020:    		a[ 7 ] = 21;
021:    		a[ 8 ] = 78;
022:    		a[ 9 ] = 19;
023:    
024:    		// int配列をInteger配列にコピー
025:    		Integer[] atemp = new Integer[ a.length ];
026:    		for ( int i = 0; i < a.length; ++ i )
027:    			atemp[ i ] = a[ i ];
028:    
029:    		// 降順ソート
030:    		Arrays.sort( atemp, Collections.reverseOrder() );
031:    
032:    		// Integer配列をint配列にコピー
033:    		for ( int i = 0; i < a.length; ++ i )
034:    			a[ i ] = atemp[ i ];
035:    
036:    		// 結果表示
037:    		for ( int i = 0; i < a.length; ++ i ) {
038:    			System.out.println( a[ i ] );
039:    		}
040:    	}
041:    }

Sort2の出力結果(降順ソート)

99
78
54
43
21
19
13
9
3
1

024:    		// int配列をInteger配列にコピー
025:    		Integer[] atemp = new Integer[ a.length ];
026:    		for ( int i = 0; i < a.length; ++ i )
027:    			atemp[ i ] = a[ i ];

int型配列aと同じ数のIntergerクラス配列atempを作成し、atempにaをコピーしています。

029:    		// 降順ソート
030:    		Arrays.sort( atemp, Collections.reverseOrder() );

Intergerクラス配列atempを降順ソートしています。

コンパレータ Collections.reverseOrderメソッド

public static Comparator Collections.reverseOrder()
■Comparableインタフェースを実装するオブジェクトのコレクションで
 自然順序付けの逆を義務付けるコンパレータを返します。 パラメータ : なし

ソート Arrays.sortメソッド

public static void Arrays.sort( T[] a, Comparator c )
■指定されたコンパレータが示す順序に従って、指定されたオブジェクトの配列をソートします。

  パラメータ a : ソートする配列
             c : コンパレータ

032:    		// Integer配列をint配列にコピー
033:    		for ( int i = 0; i < a.length; ++ i )
034:    			a[ i ] = atemp[ i ];

ソートされたIntergerクラス配列atempの値をaにコピーしています。

この方法でint型配列降順ソートを行うことができます。

次も降順ソートの例ですが、Intgerクラス配列を使わない方法です。

Sort3.java ← クリックしてダウンロードページに移動
001:    import java.util.Arrays;
002:    
003:    public class Sort3 {
004:    	public static void main( String[] args ) {
005:    		// 配列aを宣言
006:    		int[] a;
007:    
008:    		// 要素数10を設定
009:    		a = new int[ 10 ];
010:    
011:    		// 値を代入
012:    		a[ 0 ] = 13;
013:    		a[ 1 ] =  3;
014:    		a[ 2 ] = 54;
015:    		a[ 3 ] =  1;
016:    		a[ 4 ] =  9;
017:    		a[ 5 ] = 99;
018:    		a[ 6 ] = 43;
019:    		a[ 7 ] = 21;
020:    		a[ 8 ] = 78;
021:    		a[ 9 ] = 19;
022:    
023:    		// int配列を新規のint配列にコピー
024:    		int[] atemp = new int[ a.length ];
025:    		for ( int i = 0; i < a.length; ++ i )
026:    			atemp[ i ] = a[ i ];
027:    
028:    		// 昇順ソート
029:    		Arrays.sort( atemp );
030:    
031:    		// atempをa配列の後方からコピー
032:    		for ( int i = 0; i < a.length; ++ i )
033:    			a[ i ] = atemp[ a.length - i - 1 ];
034:    
035:    		// 結果表示
036:    		for ( int i = 0; i < a.length; ++ i ) {
037:    			System.out.println( a[ i ] );
038:    		}
039:    	}
040:    }

Sort3の出力結果(降順ソート)

99
78
54
43
21
19
13
9
3
1

023:    		// int配列を新規のint配列にコピー
024:    		int[] atemp = new int[ a.length ];
025:    		for ( int i = 0; i < a.length; ++ i )
026:    			atemp[ i ] = a[ i ];

int型配列aと同じ数のint型列atempを作成し、atempにaをコピーしています。

028:    		// 昇順ソート
029:    		Arrays.sort( atemp );

int型配列atempを昇順ソートしています。

031:    		// atempをa配列の後方からコピー
032:    		for ( int i = 0; i < a.length; ++ i )
033:    			a[ i ] = atemp[ a.length - i - 1 ];

ソートされたint型配列atempの値を後方からaにコピーしていきます。

ソートは昇順で行い、結果を降順にする方法です。この方法では、新規にatempというint型配列を使っていますが、昇順ソートされた配列の値の順番を入れ替える処理を使えば、新規に配列を作成する必要はありません。

■関連コンテンツ

配列 同じ型の変数をまとめた配列について解説
for文 繰り返し処理に使用するfor文について解説
変数値の交換 2つの変数値を交換する方法を解説
クイックソート 高速に配列に並び替える方法

■新着情報

2019.09.13 長さの単位変換 1マイル、1フィートは何m?
2019.09.06 クイックソート 高速に配列に並び替える方法
2019.09.05 中央値(メディアン) 配列に格納されている値の中央値を求める
2019.09.05 最頻値 配列から出現回数が最も多い値の取得
2019.09.03 配列値の反転 配列の反転処理
2019.08.05 トランプの操作 トランプを操作するクラス

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

 

 

Topへ