交換法による並べ替え

データ4つ

ファイル名 Koukan01.java

public class Koukan01 {
    public static void main( String[] args ) {
        int[] data = { 24, 17, 16, 18 };
                     // 0,  1,  2,  3
        //2まで、1まで、0まで、と繰り返す(i)
        for( int i=2; i>=0; i-- ){
            for( int j=0; i>=j; j++ ) {
                if( data[j] > data[j+1] ){
                    int tmp   = data[j];   //この3行で値の交換
                    data[j]   = data[j+1];
                    data[j+1] = tmp;
                }
            }
        }
        for (int i = 0; data.length>i; i++) {
            System.out.print(data[i] + " ");
        }
        System.out.println();
    }//mainの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Koukan01.java 
$ java Koukan01 
16 17 18 24 
$ 

データ数をnとする

ファイル名 Koukan02.java

public class Koukan02 {
    public static void main( String[] args ) {
        int[] data = { 24, 17, 16, 18, 30, 22 };
                     // 0,  1,  2,  3,  4,  5
        int n = data.length; //データ数は6 -> 4から0まで
        for( int i=n-2; i>=0; i-- ){
            for( int j=0; i>=j; j++ ) {
                if( data[j] > data[j+1] ){
                    int tmp   = data[j];
                    data[j]   = data[j+1];
                    data[j+1] = tmp;
                }
            }
        }
        for (int i = 0; data.length>i; i++) {
            System.out.print(data[i] + " ");
        }
        System.out.println();
    }//mainの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Koukan02.java 
$ java Koukan02
16 17 18 22 24 30 
$ 

i,jの変化を示す

ファイル名 Koukan03.java

public class Koukan03 {
    public static void main( String[] args ) {
        int[] data = { 24, 17, 16, 18, 30, 22 };
                     // 0,  1,  2,  3,  4,  5
        int n = data.length; //データ数は6 -> 4から0まで
        for( int i=n-2; i>=0; i-- ){
            for( int j=0; i>=j; j++ ) {
                print(data,i,j);
                if( data[j] > data[j+1] ){
                    int tmp   = data[j];
                    data[j]   = data[j+1];
                    data[j+1] = tmp;
                }
                print(data,i,j);
            }
        }
    }//mainの終わり
    static void print(int[] data, int i, int j){
        for (int x = 0; data.length>x; x++) {
            System.out.printf("%4d",data[x]);
        }
        System.out.printf(": i=%2d j=%2d",i,j );
        System.out.println();
        return;
    }//printの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Koukan03.java 
$ java Koukan03
  24  17  16  18  30  22: i= 4 j= 0
  17  24  16  18  30  22: i= 4 j= 0
  17  24  16  18  30  22: i= 4 j= 1
  17  16  24  18  30  22: i= 4 j= 1
  17  16  24  18  30  22: i= 4 j= 2
  17  16  18  24  30  22: i= 4 j= 2
  17  16  18  24  30  22: i= 4 j= 3
  17  16  18  24  30  22: i= 4 j= 3
  17  16  18  24  30  22: i= 4 j= 4
  17  16  18  24  22  30: i= 4 j= 4
  17  16  18  24  22  30: i= 3 j= 0
  16  17  18  24  22  30: i= 3 j= 0
  16  17  18  24  22  30: i= 3 j= 1
  16  17  18  24  22  30: i= 3 j= 1
  16  17  18  24  22  30: i= 3 j= 2
  16  17  18  24  22  30: i= 3 j= 2
  16  17  18  24  22  30: i= 3 j= 3
  16  17  18  22  24  30: i= 3 j= 3
  16  17  18  22  24  30: i= 2 j= 0
  16  17  18  22  24  30: i= 2 j= 0
  16  17  18  22  24  30: i= 2 j= 1
  16  17  18  22  24  30: i= 2 j= 1
  16  17  18  22  24  30: i= 2 j= 2
  16  17  18  22  24  30: i= 2 j= 2
  16  17  18  22  24  30: i= 1 j= 0
  16  17  18  22  24  30: i= 1 j= 0
  16  17  18  22  24  30: i= 1 j= 1
  16  17  18  22  24  30: i= 1 j= 1
  16  17  18  22  24  30: i= 0 j= 0
  16  17  18  22  24  30: i= 0 j= 0
$ 

降順にする

降順は大きい順です。Koukan03.javaは小さい順になっているので昇順といいます。

Koukan03.java から?の部分を変更するだけです。考えましょう。エディタで「別名で保存」を選び、Koukan04.java という名前で保存すればいいでしょう。

ファイル名 Koukan04.java

public class Koukan04 {
    public static void main( String[] args ) {
        int[] data = { 24, 17, 16, 18, 30, 22 };
                     // 0,  1,  2,  3,  4,  5
        int n = data.length; //データ数は6 -> 4から0まで
        for( int i=n-2; i>=0; i-- ){
            for( int j=0; i>=j; j++ ) {
                print(data,i,j);
                if( data[j] ? data[j+1] ){
                    int tmp   = data[j];
                    data[j]   = data[j+1];
                    data[j+1] = tmp;
                }
                print(data,i,j);
            }
        }
    }//mainの終わり
    static void print(int[] data, int i, int j){
        for (int x = 0; data.length>x; x++) {
            System.out.printf("%4d",data[x]);
        }
        System.out.printf(": i=%2d j=%2d",i,j );
        System.out.println();
        return;
    }//printの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Koukan04.java 
$ java Koukan04
24 17 16 18 30 22  i=4 j=0
24 17 16 18 30 22  i=4 j=1
24 17 16 18 30 22  i=4 j=2
24 17 18 16 30 22  i=4 j=3
24 17 18 30 16 22  i=4 j=4
24 17 18 30 22 16  i=3 j=0
24 17 18 30 22 16  i=3 j=1
24 18 17 30 22 16  i=3 j=2
24 18 30 17 22 16  i=3 j=3
24 18 30 22 17 16  i=2 j=0
24 18 30 22 17 16  i=2 j=1
24 30 18 22 17 16  i=2 j=2
24 30 22 18 17 16  i=1 j=0
30 24 22 18 17 16  i=1 j=1
30 24 22 18 17 16  i=0 j=0

英単語を意味と共にABC順に

Koukan03.java から次の部分を変更するだけです。intの配列 data が、Stringの配列 word になるので、色々変化しますが、特にwordと一緒にimiも整列する必要があるということで、作業が多くなっています。? の部分は穴埋め問題です。考えましょう。

ファイル名 Koukan05.java

public class Koukan05 {
    public static void main( String[] args ) {
        String[] word = { "red", "green", "yellow", "white", "blue" };
        String[] imi  = { "赤", "緑", "黄", "白", "青" };
        int n = word.length; //データ数は5 -> 3から0まで
        for( int i=n-2; i>=0; i-- ){
            for( int j=0; i>=j; j++ ) {
                print(word,i,j);
                if( word[j].compareTo(word[j+1]) > 0 ){
                    String tmp   = word[j];
                    word[j]   = word[j+1];
                    word[j+1] = tmp;
                    tmp       = imi[?];
                    imi[?]    = imi[?];
                    imi[?]  = tmp;
                }
                print(word,i,j);
            }
        }
        for (int x = 0; imi.length>x; x++) {
            System.out.printf("%-7s",imi[x]);
        }
        System.out.println();
    }//mainの終わり
    static void print(String[] word, int i, int j){
        for (int x = 0; word.length>x; x++) {
            System.out.printf("%-7s",word[x]);
        }
        System.out.printf(": i=%2d j=%2d",i,j );
        System.out.println();
        return;
    }//printの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Koukan05.java 
$ java Koukan05
red    green  yellow white  blue   : i= 3 j= 0
green  red    yellow white  blue   : i= 3 j= 0
green  red    yellow white  blue   : i= 3 j= 1
green  red    yellow white  blue   : i= 3 j= 1
green  red    yellow white  blue   : i= 3 j= 2
green  red    white  yellow blue   : i= 3 j= 2
green  red    white  yellow blue   : i= 3 j= 3
green  red    white  blue   yellow : i= 3 j= 3
green  red    white  blue   yellow : i= 2 j= 0
green  red    white  blue   yellow : i= 2 j= 0
green  red    white  blue   yellow : i= 2 j= 1
green  red    white  blue   yellow : i= 2 j= 1
green  red    white  blue   yellow : i= 2 j= 2
green  red    blue   white  yellow : i= 2 j= 2
green  red    blue   white  yellow : i= 1 j= 0
green  red    blue   white  yellow : i= 1 j= 0
green  red    blue   white  yellow : i= 1 j= 1
green  blue   red    white  yellow : i= 1 j= 1
green  blue   red    white  yellow : i= 0 j= 0
blue   green  red    white  yellow : i= 0 j= 0
青      緑      赤      白      黄