プログラミング初級
並べ替えの練習


単純選沢法(ヒープ・ソートの基本)


初級2の練習4で、2重の Do 〜 Loop の練習のために、数字の並べ替えをやりました。

5つの数字の小さいほうから順番に並べ替えましたが、その時に 「並べ替え」は「ソート」(sort)と呼ばれ、多種多様なソート方法があることを述べました。
覚えていますか?

代表的なものは、バブルソート、クイックソート、シェルソート、ヒープソートと名前を挙げて、 「私も名前を知っているだけで、中のロジックまでは知りません。」と申しました。 しかし・・・古いパソコンの中を整理していましたら、と〜〜〜っても懐かしいプログラムの数々が現れました。 そして、その中に「ソート練習プログラム」も、しっかり混じっておりました。

そこで、せっかく見つけたのですから、これを皆様の練習用に変更して提供いたします。 (転んでも只では起きない性格???)

実際に使用されているソート・プログラムは、ぢつーに複雑だそうです。 初級段階の皆様に、そんな複雑なロジックをやっていただくわけには まいりません。 各ロジックのほんの「さわり」と申しますか、基本中の基本のロジックだけにします。 (って「私が知っている部分だけ」という意味です。)

ほんの少し「ソート・プログラム」の香りをかいでいただければ、幸いです。 で、もちろんDo 〜 Loop の練習にもなりますしね。(笑)

初級2の練習4で、「交換法」をやりました。 忘れた方のために、「並べ替えの練習」メニューの4番目に入れておきます。




単純選沢法の考え方


この練習では、Excel のセルを数字の入力域および出力域として利用します。
Sheet1 のセルA1〜A5 に、適当な整数を入れておいてください。

この「単純選沢法」のロジックは簡単に言うと、一番小さい数字を探して入れ替える方法です。
では、例を出してみましょう。

例:55,44,33,22,11 の5つの数字を、小さい順に並べ替えます。

  1. まず1〜5番目で、一番小さい数字を探します。
     ↓───────────↓
    55,44,33,22,11

    一番小さい数字は11なので、1番目の数字55と入れ替えます。
    すると、11,44,33,22,55となります。


  2. 次は2〜5番目で、一番小さい数字を探します。
        ↓────────↓
    11,44,33,22,55

    この中で一番小さい数字は22なので、2番目の数字44と入れ替えます。
    すると、11,22,33,44,55となります。

    あら、もう小さい順に並んでしまいました・・・。
    が、どんな数字が来てもちゃんと並び替えができるようにするため、プログラムはここで終了してはいけません。


  3. 次は3〜5番目で、一番小さい数字を探します。
           ↓─────↓
    11,22,33,44,55

    この中で一番小さい数字は33ですが、3番目の数字なので入れ替えません。
    もし一番小さい数字が3番目の数字でなければ、3番目の数字と入れ替えます。


  4. 次は4〜5番目で、一番小さい数字を探します。
              ↓──↓
    11,22,33,44,55

    この中で一番小さい数字は44ですが、4番目の数字なので入れ替えません。
    もし一番小さい数字が4番目の数字でなければ、4番目の数字と入れ替えます。

ここまで実行すれば、どういう並び方になっていても、必ず小さい順に並び替えられます。 初級2の練習4の「交換法」より簡単に思えるかもしれませんね。
でも、例えば、「1〜5番目で一番小さい数字」って、どうやって探しますか? どんなロジックで、どんなプログラムになるか、わかりますか?




一番小さい数字の探し方


1〜5番目で、一番小さい数字を探します。

  1. 一番小さい数字用の変数を宣言します。
    Dim min_suji  As Integer '一番小さい数字
    Dim min_no   As Integer '一番小さい数字が何番目か


  2. まず1番目の数字が一番小さいと仮定します。
    一番小さい数字の情報を、変数 min_suji, min_no にセットします。
    min_suji = Cells(1, 1)  'min_suji ← 1番目の数字
    min_no = 1        'min_no ← 1(番目)


  3. 2番目の数字と一番小さい数字を比較します。
    If Cells(1, 2) < min_suji Then
    もし2番目の数字のほうが小さいなら、2番小さい数字の情報を、変数 min_suji, min_no にセットします。
      min_suji = Cells(1, 2)  'min_suji ← 2番目の数字
      min_no = 2        'min_no ← 2(番目)
    End If


  4. 3番目の数字と一番小さい数字を比較します。
    If Cells(1, 3) < min_suji Then
    もし3番目の数字のほうが小さいなら、3番小さい数字の情報を、変数 min_suji, min_no にセットします。
      min_suji = Cells(1, 3)  'min_suji ← 3番目の数字
      min_no = 3        'min_no ← 3(番目)
    End If


  5. 4番目の数字と一番小さい数字を比較します。
    If Cells(1, 4) < min_suji Then
    もし4番目の数字のほうが小さいなら、4番小さい数字の情報を、変数 min_suji, min_no にセットします。
      min_suji = Cells(1, 4)  'min_suji ← 4番目の数字
      min_no = 4        'min_no ← 4(番目)
    End If


  6. 5番目の数字と一番小さい数字を比較します。
    If Cells(1, 5) < min_suji Then
    もし5番目の数字のほうが小さいなら、5番小さい数字の情報を、変数 min_suji, min_no にセットします。
      min_suji = Cells(1, 5)  'min_suji ← 5番目の数字
      min_no = 5        'min_no ← 5(番目)
    End If

はい、これで、変数 min_suji には一番小さい数字が、変数 min_no には一番小さい数字が何番目かが入っています。
どうして変数 min_no が必要なのかが、わからない人がいますか?
一番小さい数字と「入れ替え」なければならないからです。
「入れ替え」は、どうするのでしたか?

If min_no <> 1 Then
  もし一番小さい数字が、1番目の数字でなければ
  Cells(6, 6) = Cells(1, 1)    '第3のセル ← 1番目の数字
  Cells(1, 1) = Cells(1, min_no)  '1番目のセル ← 一番小さい数字
  Cells(1, min_no) = Cells(6, 6)  '一番小さい数字のセル ← 第3のセル
End If


さ、これでプログラムを完成してください。
そして、もちろん、Do 〜 Loop に直してくださいね。
ではでは、グッド・ラック!




戻る

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル