〜 配列を使ったプログラム 〜






@ソーティング

 この章では、配列を使ったいろいろなプログラムを見ていきましょう。まず、配列を用いるプログラムで代表的なのがソーティングです。ソーティングとはデータを大きい順に並べ替えたり、小さい順に並べ替えたりすることです。普段私たちがこのようなことをするときは目で見て、順々に並べていけばいいのですが、ではコンピュータにそれをやらせるにはどのようなことをすればいいのでしょうか。やり方はいろいろあるのですがここでは代表的なセレクションソートを紹介しましょう。



Aセレクションソート

 さて、@でちょっと離したセレクションソートについて見ていきましょう。今、5つの整数のデータ(34、21、54、12、4)が配列の形であるとします。この5つを昇順(小さい順)に並べることを考えてみましょう。

<初期状態>
 34 21 54 12 4

 まず、一番最初のデータ(ここでは34)を基準にします。そして、2番目のデータ(21)が最初にあるデータより小さかったら入れ替えます。

<Step1>

 21 34 54 12 4
 (34より21の方が小さいので入れ替える)

 次に同じように最初の位置にあるデータと3番目のデータを比較します。

<Step2>

 21 34 54 12 4
  (21と54を比較して、54の方が大きいのでそのまま)

 以下、同じようにして、基準にあるにあるデータから最後までのデータを一つずつ比較していって、小さければその場所を入れ替えます。

<Step3>

 4 34 54 21 12
 (一番最初にあるデータを基準にした比較)

つぎに基準となるデータを2番目にあるデータにして、同じようにそれぞれのデータを比較します。

<Step4>

 4 12 54 34 21
 (2番目にあるデータを基準にした比較)

 あとは同じようにそれぞれのデータについて比較していけばいいのです。

<Step5>

 4 12 21 34 54
  (最後まで比較した結果)




Bセレクションソートのプログラミング

 では、Aで説明したセレクションソートを実際にプログラムで書くとどうなるのでしょうか。まず、配列型で入力されたデータを、一文字一文字それぞれについて比較していくので、2つのfor文(基準となるデータを移動するものと基準から最後までのデータと比べるもの)と言う風な2重ループになります。そして、それぞれについてデータの数が小さければ配列の位置を取り替えれば良いわけです。実際にプログラムを書いてみると次のようになります。


program selection_sort;
{$APPTYPE CONSOLE} uses SysUtils;

var
 data:array[1..5] of integer;
 i,j,d:integer;

begin
 writeln('5つの整数データを入力して下さい。');
 for i:=1 to 5 do
  begin
   write('データ',i,':');
   readln(data[i]);
  end;

 for i:=1 to 5 do
  begin
   for j:=i to 5 do
    begin
     if data[i]<data[j] then
      begin
       d:=data[i];
       data[i]:=data[j];
       data[j]:=d;
      end;
    end;
  end;

 writeln('小さい順に並べます');
 for i:=1 to 5 do
  writeln(data[i]);

 writeln('Enterキーを押してください。');
 readln;
end.

 と言う風になります。これを実行すると・・・


<実行画面>
5つの整数データを入力して下さい。
データ1:3
データ2:1
データ3:2
データ4:5
データ5:4
小さい順に並べ替えます。





Enterキーを押してください。


 という風になります。さて、このプログラムは一体しているのでしょうか。


Cプログラムの動作

 さて、3で実際にセレクションソートのプログラムを見てみましたがどのようなことをしているのでしょうか。まず、宣言部を見てください。

var
 data:array[1..5] of integer;
 i,j,d:integer;

 ここでは、dataという整数型で長さが5(5個の箱がある)の配列を用意しています。あと、変数として整数型のi,j,dというものも宣言しています。そしてメインプログラムに移動します。次の行を見てください。


begin
 writeln('5つの整数データを入力して下さい。');
 for i:=1 to 5 do
  begin
   write('データ',i,':');
   readln(data[i]);
  end;

 この部分では、実際に配列に要素を入力させるという作業をさせています。どのようなことをしているのかと言うと、まず、配列の長さは5と分っているので、for文で5回ループを回します。そして、配列と言うものは、ある型の変数を並べた箱の列みたいなものですから、それぞれの箱にread文を使って値を入力させているのです。ここで、配列に値は入りました。次に肝心のソーティングをしなければいけません。実際にソーティングをしているのが次の文です。


 for i:=1 to 5 do
  begin
   for j:=i to 5 do
    begin
     if data[i]<data[j] then
      begin
       d:=data[i];
       data[i]:=data[j];
       data[j]:=d;
      end;
    end;
  end;

 ここで実際にセレクションソートを使って小さい順にソーティングしています。では、どのようなことをしているのでしょうか。セレクションソートとは簡単に言うと、ある基準になるデータから最後までのデータを比較して行って、それぞれの大小関係によって位置を交換するというものでした。ここではまず、for文(変数がi)で基準となるデータを決めます。ですから一番初めはdata[1]にあるデータを基準にします。そして別のfor文(変数がj)で比べるデータを今のiの値から配列の長さの5まで動かします。そして、次のif文で大小関係を比較します。ですから、このif文は、基準となるデータより比べるデータの方が大きければ処理をしなさいという意味になります。さて、もしも基準となるデータの方が大きかったらその位置を取り替えるというのがセレクションソートのやり方でした。この取り替えると言う作業にはちょっとした工夫がいります。例えば、

data[i]:=data[j];
data[j]:=data[i];

 と言う風にやりたい所ですがこれでは両方data[i]の値が入ってしまいます。要するに一回取り替える値をどっかにしまっておかなければならないですよね。そこで、

 if data[i]<data[j] then
   begin
    d:=data[i];
    data[i]:=data[j];
    data[j]:=d;
   end;

 という風に一個dというダミーの変数を作って取り替えるときには一回取り替える値をこのdにしまってから取り替えるわけです。あとは、これをfor文で一個一個繰り返していけばいいわけです。そして、最後の、

 writeln('小さい順に並べます');
 for i:=1 to 5 do
  writeln(data[i]);

 の部分で実際にデータを書き出すわけです。



目次へ