2019.03.11
Javaプログラミング
ソート(sort)
配列に格納されている値を大きい方から順番に、小さい方から順番に並び替えるプログラムを紹介します。
小さい値から大きい値に並び替えることを昇順ソートといいます。例えば、{8,3,6,1,7}の昇順ソートは{1,3,6,7,8}です。
昇順ソート例 : { 8, 3, 6, 1, 7 } → { 1, 3, 6, 7, 8 }
大きい値から小さい値に並び替えることを降順ソートといいます。例えば、{8,3,6,1,7}の降順ソートは{8,7,6,3,1}です。
降順ソート例 : { 8, 3, 6, 1, 7 } → { 8, 7, 6, 3, 1 }
Javaソースコード - 昇順ソート
Sort1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031
import java.util.Arrays; public class Sort1 { public static void main( String[] args ) { // 配列aを宣言 int[] a; // 要素数10を設定 a = new int[ 10 ]; // 値を代入 a[ 0 ] = 13; a[ 1 ] = 3; a[ 2 ] = 54; a[ 3 ] = 1; a[ 4 ] = 9; a[ 5 ] = 99; a[ 6 ] = 43; a[ 7 ] = 21; a[ 8 ] = 78; a[ 9 ] = 19; // 昇順ソート Arrays.sort( a ); // 結果表示 for ( int i = 0; i < a.length; ++ i ) { System.out.println( a[ i ] ); } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Sort1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Sort1.java
実行
C:\talavax\javasample>java Sort1
出力結果
1 3 9 13 19 21 43 54 78 99
そこで、Arraysクラスで降順ソートできるIntegerクラスの配列に、int型の値を一時的にコピーし、降順ソートの結果をint型に戻す方法を使っています。
Javaソースコード - 降順ソート
Sort2.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041
import java.util.Arrays; import java.util.Collections; public class Sort2 { public static void main( String[] args ) { // 配列aを宣言 int[] a; // 要素数10を設定 a = new int[ 10 ]; // 値を代入 a[ 0 ] = 13; a[ 1 ] = 3; a[ 2 ] = 54; a[ 3 ] = 1; a[ 4 ] = 9; a[ 5 ] = 99; a[ 6 ] = 43; a[ 7 ] = 21; a[ 8 ] = 78; a[ 9 ] = 19; // int配列をInteger配列にコピー Integer[] atemp = new Integer[ a.length ]; for ( int i = 0; i < a.length; ++ i ) atemp[ i ] = a[ i ]; // 降順ソート Arrays.sort( atemp, Collections.reverseOrder() ); // Integer配列をint配列にコピー for ( int i = 0; i < a.length; ++ i ) a[ i ] = atemp[ i ]; // 結果表示 for ( int i = 0; i < a.length; ++ i ) { System.out.println( a[ i ] ); } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Sort2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Sort2.java
実行
C:\talavax\javasample>java Sort2
出力結果
99 78 54 43 21 19 13 9 3 1
024 025 026 027
// int配列をInteger配列にコピー Integer[] atemp = new Integer[ a.length ]; for ( int i = 0; i < a.length; ++ i ) atemp[ i ] = a[ i ];
029 030
// 降順ソート
Arrays.sort( atemp, Collections.reverseOrder() );
032 033 034
// Integer配列をint配列にコピー for ( int i = 0; i < a.length; ++ i ) a[ i ] = atemp[ i ];
Javaソースコード - 降順ソート(Integerクラスを使わない)
Sort3.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040
import java.util.Arrays; public class Sort3 { public static void main( String[] args ) { // 配列aを宣言 int[] a; // 要素数10を設定 a = new int[ 10 ]; // 値を代入 a[ 0 ] = 13; a[ 1 ] = 3; a[ 2 ] = 54; a[ 3 ] = 1; a[ 4 ] = 9; a[ 5 ] = 99; a[ 6 ] = 43; a[ 7 ] = 21; a[ 8 ] = 78; a[ 9 ] = 19; // int配列を新規のint配列にコピー int[] atemp = new int[ a.length ]; for ( int i = 0; i < a.length; ++ i ) atemp[ i ] = a[ i ]; // 昇順ソート Arrays.sort( atemp ); // atempをa配列の後方からコピー for ( int i = 0; i < a.length; ++ i ) a[ i ] = atemp[ a.length - i - 1 ]; // 結果表示 for ( int i = 0; i < a.length; ++ i ) { System.out.println( a[ i ] ); } } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Sort3.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Sort3.java
実行
C:\talavax\javasample>java Sort3
出力結果
99 78 54 43 21 19 13 9 3 1
023 024 025 026
// int配列を新規のint配列にコピー int[] atemp = new int[ a.length ]; for ( int i = 0; i < a.length; ++ i ) atemp[ i ] = a[ i ];
028 029
// 昇順ソート
Arrays.sort( atemp );
031 032 033
// atempをa配列の後方からコピー for ( int i = 0; i < a.length; ++ i ) a[ i ] = atemp[ a.length - i - 1 ];
ソートは昇順で行い、結果を降順にする方法です。この方法では、新規にatempというint型配列を使っていますが、昇順ソートされた配列の値の順番を入れ替える処理を使えば、新規に配列を作成する必要はありません。
以上です。