バケツソート

[ つぎ | うえ ]

課題3

バケツソートを実現しよう。

このプロジェクトを以下のように設定しよう。

タイトル バケツソート
説明 バケツソートを実現しよう。
フレームタイトル 課題3

最初に、タイトル、説明などを設定してプロジェクトを生成しよう。


コンピュータよりも、人間がソート(整列)を行う場合に近いアルゴリズムを紹介しよう。すでに紹介した、挿入法もよく人間が行うソートである。今回のソートでは、前処理として、(数字だったら)0〜9、10〜19、20〜29というようにその位であらかじめ分類し、その後、各グループ毎に挿入法などを用いてソートする方法である。このソート方法をバケツソートという。

例えは、以下の数字の並びがあるとしよう。

、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、1343、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 を定数とする。

  1. N個の値を Array[0] 〜 Array[N-1] に入力する。
  2. i を 0、j を N-1、count を 0 とする。
  3. Array[0] 〜 Array[j] まで、count 〜 count+9 の間にある値を探す。count が 210 であれば終了。
  4. もし、見つからなければ 10 へ飛び越し
  5. 最初に、見つかった値 Array[i] を A とし、Array[j] から j を減らす方向へ、count 〜 count+9 の間に「ない」値を探す。
  6. もし、見つからなければ交換ぜずに、9 へ飛び越し
  7. 最初に、見つかった値 Array[j] を B とする。
  8. もし、j > i が成り立っていれば交換する(Array[i]とArray[j])。
  9. 3 へ飛び越し、残りの配列を検索する。
  10. count = count + 10 とし、3 へ飛び越し

以上のアルゴリズムをプログラムしよう。本課題では、0〜9、10〜19のような各位の中の値については、プログラムしない。他の挿入法などを使ってプログラムすればよい。


以下のようにボタンを配置する。

下部に、JPanel を定義するのを忘れないようにしよう。


最初に、import 文を追加しよう。

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


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

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


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

最初に、0 〜 9 の間の値を検索することを示している。


では、「整列」ボタンをクリックした場合のメソッドを記述しよう。


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


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


[ つぎ | うえ ]
yasu@i.hosei.ac.jp