最大値の選択 ―― 復習

問題1

整数の配列を宣言し、ランダムに初期化しておく。 この配列の要素の最大値を探し、配列の最後の要素と交換する プログラムを書きなさい。

たとえば、配列を

int [] ... = { 122, 132, 98, 77, 145, 182, 155, 132, 144 };
のように初期化した場合、以下のような表示をするプログラムを作成しましょう。

exchangex.gif

回答例

入れ替えをするには、最大値が配列のどこにあったかを憶えておく必要があります。

最大値のある場所(添字)を保存する maxindex という整数の変数を用意します。

最大値の見付かった時の添字が maxindex に保存されているので、 最大値は area[maxindex] という形でいつでも参照可能です。

最大値と配列の最後の要素を交換する際に、 一時的な変数が必要になります。

a の内容と b の内容を交換する場合、 いきなり b = a; とやると

exchange1.gif

b に入っていた 200 が消えてしまいます。

temp という新たな変数を用意して、 b の値を退避しておき、 最後に、temp から a に戻せば、2値の交換が終わります。

exchange2.gif

アルゴリズム

  1. 配列 area を宣言し、初期値を与える。
  2. 配列の先頭の要素が最大であると仮定する。
    2.1 maxindex = 0;
  3. 配列の2番目( i = 1; )から、 最後まで( i <area.length )、 以下のことを繰り返す。
    3.1 area[i] が今までの最大値より大きかった場合
    3.1.1 maxindex を更新
  4. 最大値と(area[maxindex])と 配列の最後の要素の値(area[area.length-1])を交換
  5. 配列 area の内容を表示する

プログラム Exchange2.java

ソート

問題2

整数の配列を宣言し、ランダムに初期化しておく。 この配列の要素を小さい順に並べなおして表示しなさい。

たとえば、配列を

int [] ... = { 122, 132, 98, 77, 145, 182, 155, 132, 144 };
のように初期化した場合、以下のような表示をするプログラムを作成しましょう。

sortx.gif

問題1で最大値を配列の最後に移動できるようになりました。 配列の最後を無視して、先頭からはじめて最後の1つ手前までの要素に対して同じことをやれば、 配列の中の大きいほうから2つが配列の最後に順にならびます。 最大値を見付けて最後に移動するという操作を繰り返してソートをしましょう。

問題1の回答例のアルゴリズムを手直しします。黒い部分が今回の追加部分です。 緑の部分が問題1のアルゴリズムで、赤字部分が変更箇所です。

どこまでの範囲で最大値を探すか、つまり最大値が見付かった時に どこに移動させるかを保持する lastindex
最大値のある場所(添字)を保存する maxindex と
値を入れ替えるための temp というつの変数を使います。

アルゴリズム

  1. 配列 area を宣言し、初期値を与える。
  2. lastindex を area.length - 1 にする。
  3. 配列の先頭の要素が最大であると仮定する。
    3.1 maxindex = 0;
  4. 配列の2番目( i = 1; )から、 範囲の最後まで( i <= lastindex )、 以下のことを繰り返す。
    4.1 area[i] が今までの最大値より大きかった場合
    4.1.1 maxindex を更新
  5. 最大値のあった場所(area[maxindex])と 範囲の最後の要素の値 (area[area.length-1])を交換
  6. lastindex を 1 減らし(範囲を縮め)、 1 以上であれば 3.から繰り返す。
  7. 配列 area の内容を表示する

2.と 6. で外側の for ループができます。 3.〜5.のインデンテーションを忘れずに。

回答例

プログラム Sort2.java

実行例のアニメーション

「進む」のボタンを押すと、プログラムの進行に伴なって変数の状態が変わる様子を表示します。
赤く表示された文が実行された後の状態を図示しています。

Internet Explorer 6.0 でのみ動作確認をしています。 Netscape では動きません−−調査中です。


Top Page
更新日: