6. 1 ソーティング 6. 2 最小のデータを探す 6. 3 練習問題 6. 4 値の入れ替え 6. 5 配列の内容の表示 6. 6 練習問題 6. 7 組になったデータのソーティング 6. 8 宿題 6. 9 おまけ
データをある順序で並べ替えることをソート(sort)するといいます。ここで「ある順序」とは、数値なら大きい順、小さい順、文字列ならアルファベット順など、2つのデータを比較してどちらが前に来るかがはっきり分かれば、どんなものでも構いません。
例えば、次のような5個の数値を小さい順に並べ替えることを考えてみましょう。
まず、一番小さい数値を見つけて、それを一番目に持ってきます。
次に、残った中で一番小さい数値を見つけて、それを二番目に持ってきます。
これを残りが無くなるまで繰り返せばよいのですが、
このやり方をもっと正確に書いてみましょう。
上のアルゴリズムからプログラムを作るには、「最小のデータを探す」や「入れ替える」というところも、アルゴリズムを明らかにする必要があります。
これからプログラムを少しずつ作っていきます。SfcTemplate1.java,SfcTemplate1.html を Sort.java, Sort.html にコピーして準備しましょう。
これは前回やりました。前回は6.2 最小のデータを探す
このアルゴリズムをプログラムにすると、次のようになります。
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
void sfcProcess () {
//ここに自分のプログラムを書く
int a[] = { 17, 23, 10, 32, 13 };
int i = searchMin(a);
sfcOutput("a["+String.valueOf(i)+"] : "+String.valueOf(a[i]));
}
int searchMin (int a[]) {
int minIndex = 0;
for ( int i = 1; i < 5; i = i + 1 ) {
if ( a[minIndex] > a[i] ) {
minIndex = i;
}
}
return minIndex;
}
|
上のアルゴリズムとプログラムは、配列全体の最小値を探します。しかし、ソートのプログラムで使うには、[n] 以降のデータの最小値を探す必要があります。そのようにプログラムを変更しなさい。例えば、[3]以降の最小値を探したいときは、46行目を
int i = searchMin(a, 3);と変更すると、a[4] : 13 と表示される、ということです。
次に、[n] のデータと [m] のデータを入れ替えるアルゴリズムを考えましょう。
a[n], a[m] の値を入れ替えるとき、
a[n] = a[m]; a[m] = a[n];としたのではうまくいきません。a[n] = a[m]; とした途端に、a[n]に入っていた値が消えてしまうからです。値を一時退避させるための変数を作って、次のようにします。
temp = a[n]; a[n] = a[m]; a[m] = temp;
配列の内容を文字列に変換するアルゴリズムを考えましょう。
String 型の変数 s に、コンマと a[i] の内容を追加するには
s = s + ", " + String.valueOf(a[i]);とします。
今までのアルゴリズムを組み合わせて、ソーティングのプログラムを完成させましょう。
次のようなデータをソートすることを考えてみましょう。
Country | Total Population (in thousands, 1997 est.) | GDP (million US$, 1995) |
United Kingdom | 58201 | 1102658 |
Egypt | 64466 | 60436 |
India | 960178 | 338785 |
Japan | 125638 | 5217573 |
Australia | 18250 | 358147 |
United States of America | 271648 | 6954787 |
Brazil | 163132 | 717187 |
このデータをそのままグラフにするプログラムは次のようになります。SfcTemplate2.java, SfcTemplate2.html を Nation.java,Nation.html にコピーして、どのように表示されるか確認しましょう。
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
void sfcDraw(Graphics g) {
//ここに自分のプログラムを書く
String name[] = {"UK", "Egypt", "India", "Japan",
"Australia", "USA", "Brazil"};
int population[] = {58201, 64466, 960178, 125638,
18250, 271648, 163132};
int gdp[] = {1102658, 60436, 338785, 5217573,
358147, 6954787, 717187};
for (int i = 0; i < 7; i = i + 1) {
g.setColor(Color.black);
g.drawString(name[i], 10, i*35+30);
g.setColor(Color.blue);
g.fillRect(80, i*35+15, population[i]*200/1000000, 10);
g.setColor(Color.green);
g.fillRect(80, i*35+25, gdp[i]*200/7000000, 10);
}
}
|
上のデータを人口の多い順にソートして、グラフを描くプログラムを書きなさい。
上のプログラムを改造し、入力として name、population、GDP のどれかを入れると、それぞれ国名のアルファベット順、人口の多い順、GDPの大きい順に並べ替えて、同じようにグラフを描くプログラムを書きなさい。
int searchMin(int a[], int n)と、
int searchMin(String a[], int n)は別のメソッドで、引数の型によってどちらを呼び出すかが決まります。
慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学