課題3
| バケツソートを実現しよう。 |
このプロジェクトを以下のように設定しよう。
| タイトル | バケツソート |
| 説明 | バケツソートを実現しよう。 |
| フレームタイトル | 課題3 |
最初に、タイトル、説明などを設定してプロジェクトを生成しよう。
コンピュータよりも、人間がソート(整列)を行う場合に近いアルゴリズムを紹介しよう。すでに紹介した、挿入法もよく人間が行うソートである。今回のソートでは、前処理として、(数字だったら)0〜9、10〜19、20〜29というようにその位であらかじめ分類し、その後、各グループ毎に挿入法などを用いてソートする方法である。このソート方法をバケツソートという。
例えは、以下の数字の並びがあるとしよう。
4、47、70、13、43、23
[0] [1] [2] [3] [4] [5]
余分に値を格納する領域はないものとし、交換により、0〜9、10〜19などの位によりグループ化しよう。最初に、0〜9の間の値を左から探す。4([0])が見つかる。それと右側の値を交換するために、今度は、右から0〜9の間に「ない」値を探し、23([5])が見つかる。4と23を交換しよう。
23、47、70、13、43、4
となる。さらに、47([1])、70([2])と0〜9の間にある値を探し、13([3])まできたところでこれ以上ないことがわかる(もし、43[4]が該当しても交換できない)。次に、10〜19の間の値を23から(左から右へ)探し、13があることがわかる。13は、今度は、右の43([4])から10〜19の間に「ない」値を探し、43が見つかる。13と43を交換しよう。さらに、10〜19の値を探すがないことがわかるので次へ進む。
23、47、70、43、13、4
今度は、23([0])から43([3])までに20〜29の間の値を探し、23([0])が見つかる。右の43([4])から20〜29の間に「ない」値を探す。43が見つかる。23と43を交換しよう。
43、47、70、23、13、4
43([0])から70([2])までに30から49の値を探し、該当する値がないことがわかる。さらに、43から70までに、40〜49の間の値を探し43が見つかる。右の70から40〜49に「ない」値を探し、70が見つかる。43と70を交換する。
70、47、43、23、13、4
同様に、47がみつかるが右から検索する値も47であるので交換はしない。
70、47、43、23、13、4
50〜59の間の値、60〜69の間の値を探すが、該当する値がないことがわかる。70〜79の間の値についは、70が見つかるが、右から検索する値がないので交換はしない。80〜89の間の値、90〜99の間の値についても該当する値がないことにより、上の並びが求める値の並びであることがわかる。
このアルゴリズムを以下に示す。以下で、i、j、count を変数とし、N を定数とする。
以上のアルゴリズムをプログラムしよう。本課題では、0〜9、10〜19のような各位の中の値については、プログラムしない。他の挿入法などを使ってプログラムすればよい。
以下のようにボタンを配置する。

下部に、JPanel を定義するのを忘れないようにしよう。
最初に、import 文を追加しよう。

これまでのソートの問題と同様に、変数を宣言しよう。

さらに、これまでのソートの問題と同様に「初期化」ボタンに対するメソッドを定義する。

ここで、Draw( ) メソッドも同様に定義することができる。

すると、「初期化」ボタンをクリックすることにより以下のように実行することができる。

最初に、0 〜 9 の間の値を検索することを示している。
では、「整列」ボタンをクリックした場合のメソッドを記述しよう。

上のメソッドで呼び出す search( ) メソッドは以下のようになる。

プログラムを実行し、「初期化」ボタンをクリックした後、「整列」ボタンをクリックすると以下のようになる。
