問題003

山や丘の高さをメートル単位で1から10,000までの範囲の整数で表した10個のデータがあります。
その10このデータを入力し、その中で、高い順から3つ出力して終了するプログラムを作成してください。
※同じ高さの山が複数あるかもしれないことに注意してください。

入力

山の高さ1(整数)
山の高さ2(整数)
.
.
山の高さ10(整数)

出力

最も高い山の高さ(整数)
2番目に高い山の高さ(整数)
3番目に高い山の高さ(整数)

入力例

1819
2003
876
2840
1723
1673
3776
2840
1592
922

出力例

3776
2840
2840

考え方

最も簡単なソート(並べ替え)のアルゴリズムを学びましょう。

簡単なソート(面倒なので要素が5つの場合・降順にする場合)

数値の間を調べます。
左の方が小さかったら入れ替えます。

まず、[0]と[1]について
[0][1][2][3][4]
12354
[0][1][2][3][4]
21354

同様に、[1]と[2]、[2]と[3]、[3]と[4]についても調べ、入れ替えます。

次に、何回これを行えば完全にソートが完了するのか考えます。
(i)一番左に一番小さい数がある場合
間を左から一通り調べれば、一番右に移動します。
(i)一番右に一番大きい数がある場合
間を左から一通り調べるだけでは、1つ左に移動するだけです。
これ(間を左から一通り調べる)を4回すれば、一番右に移動します。

結論
n個の配列をソートするには(n-1)個の要素の間を(n-1)回調べて交換すればよい。

//
//A003.java
//

import java.io.*;

public class A003{
    public static void main(String[] args)throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        //データ入力用の配列
        int[] data=new int[10];
        //データ入力
        for(int i=0;i<data.length;i++){
            data[i]=Integer.parseInt(br.readLine());
        }
        //隣の数を比べて左に大きい方がくるようにする
        //間は9個あり、9まわり調べれば全体が降順に並ぶ
        for(int i=0;i<data.length-1;i++){
            for(int j=0;j<data.length-1;j++){
                //もし、あるところよりその右の方が大きかったら
                if(data[j]<data[j+1]){
                    //交換する
                    int temp=data[j];
                    data[j]=data[j+1];
                    data[j+1]=temp;
                }
            }
        }
        //大きい順にならんでいるので[0]..[2]の3つを出力
        for(int i=0;i<3;i++){
            System.out.println(data[i]);
        }
        br.close();
    }
}

正しくゲームをするページ>パソコン甲子園攻略>ココ