VBSプログラミング最初の一歩 VBScript

整列

では、今度は配列を数値の小さい順(あるいは大きい順)に並べ替えるアルゴリズムです。
なお、小さい順のことを「昇順」、大きい順のことを「降順」といいます。
整列はこれまで出てきたアルゴリズムと比較すれば少し複雑ですが、これをすらすらかければ簡単なアルゴリズムはもう卒業といったレベルなのでがんばりましょう。

これも合計の時の配列を例に使います。

Dim num(5)

num(1)=5
num(2)=8
num(3)=9
num(4)=3
num(5)=2

これは5,8,9,3,2のようにバラバラに並んでいます。これを2,3,5,8,9の順に並べ替えるわけです。
これは最小の値を見つけるアルゴリズムを何回も繰り返すことで達成できます。
まず、5つの中で最も小さい数を1番目におきます。次に残り4つの中で一番小さい数を2番目に起きます。次は残り3つの中で一番小さい数を3番目に起きます。これを繰り返していきます。

プログラム的には、二重ループになります。つまりfor文の中にfor文があるわけです。
まず、一個目に焦点を当てて、これと2個目、3個目・・を比較していきます。そして、一個目より小さい数があれば一個目と入れ替えます。これを最後まで行えば一番小さい数が一個目に入っているはずです。

次に二個目に焦点を当てて、これを3個目、4個目・・と比較していきます。そうすれば今度は二番目に小さい数が二個目に入っているはずです。

これをどこまで繰り返すかですが、4番目の小さい数を決めてしまえば最後は自動的に決まります。つまり、5個目よりも一個少ないところまで焦点をあてて比較していきます。

外側のループは今何個目に焦点をあてているかを表します。最初は一個目、次は2個目と進んでいき、最後は4個目まで焦点をあてればいいのでした。そのため、以下のようなループになります。

for i=1 to 4

内側のループは焦点を当てた要素との比較対象を示します。つまり、最初は1個目との比較対象です。これは2個目から5個目まででした。二回目は2個目との比較対象ですからこれは3個目から5個目までです。つまり、焦点をあてた次の要素から最後まででいいわけです。ですから以下のようなループになります。

for j=i+1 to 5

内側のループのカウンタ変数 j の初期値は外側のループのカウンタ変数 i に 1を加えたものになります。これは1個目と2~5個目を比較、2個目と3~5個目を比較していくわけですから、焦点をあてた要素の次の要素から始めるわけです。

そして、i番目とj番目の要素を比較します。i番目の要素が現在の最小チャンピオンですから、その要素よりも小さい要素が出てきたら新チャンピオン誕生となり、入れ替えます。

if( num(i) > num(j) )then
	work = num(i)
	num(i) = num(j)
	num(j) = work
end if

これらをまとめると以下のようになります。

for i=1 to 4
	for j=i+1 to 5
		if( num(i) > num(j) )then
			work = num(i)
			num(i) = num(j)
			num(j) = work
		end if
	next
next

●全プログラムリスト

Dim num(5)

num(1)=5
num(2)=8
num(3)=9
num(4)=3
num(5)=2

for i=1 to 4
	for j=i+1 to 5
		if( num(i) > num(j) )then
			work = num(i)
			num(i) = num(j)
			num(j) = work
		end if
	next
next

'内容の表示
for i=1 to 5
	MsgBox i & "個目:" & num(i)
next




問題9-3:
配列の1個目から10個目までに1~100までのランダムな数を入れ、それを大きい順に整列しよう。