【 全体の目次 】

【 ←前に戻る この章の目次 次に進む→ 】


基本選択法(最小値選択法)のプログラム


では、基本選択法(最小値選択法)のプログラムで、実際にデータを小さい順に並び替えてみましょう。並び替えのプログラムでは、一次元配列多重ループを利用します。

 

<#define>

3行目に使われている#defineは、プログラムの本体に特定の値を埋め込まないで処理する場合に役に立ちます。

   #define 定数 数字

このプログラムでは、#define N 7で、Nの値を7に設定しています。Nは、並び替えるデータ数を表しています。並び替えるデータ数が変わっても、この値を変えるだけで済みます。

 

<配列要素に要素数を書かない>

6行目のkosuu[]には、要素数が書かれていません。普通ならば、kosuu[7]とするところですが、一次元配列の場合、要素数は書かなくても良いという特別ルールがあるので、今回はそのルールを使います。(ただし、二次元配列の場合には、必ず要素数が必要です。)これによって、#define N 7だけで、データ数の書き替えが済みます

 

<基本選択法の並び替え処理>

では、並び替え部分の説明をします。並び替え部分は理解が難しいので、繰り返しの作業を順に追って説明していきます。(順に追っていっているので、説明が長くなっています。)

(1)まず、外側のループに入ると、最初はiの値が0(kosuu[0])になります。
このとき、kosuu[0]は何を表しているかというと、配列の0番目(一番左)を表します。
(配列要素は0から始まるので、データは一番左の変数kosuu[0]から順に入っている。)

(2)次に、まだ最小値がどれなのか分からないので、最初はi番目、つまり配列の0番目(kosuu[0])に入っている値を仮に最小値と設定します。プログラムの

min=i;   ・・・仮の最小値設定

の部分が、その仮の最小値設定です。最小値を表す変数minに、仮の最小値が入っている配列番号を記憶させておくことができます。

(3)そうしたら、いよいよ最小値を探し出す作業です。今、仮に配列の0番目(kosuu[0])を最小値としているので、配列の1番目(kosuu[1])以降にそれよりも小さい値がないか確認していきます。

まず、1番目以降をkosuu[j]で表します。1番目以降の値なので、j=i+1を使って1番目以降の値になるようにします。よって、いまiが0なので、最初はjの値が1となり、配列の1番目(kosuu[1])を表すことになります。

次に、j番目とmin番目の値を比べます。

if(kosuu[j]<kosuu[min]){
  min=j;
}

これによって、まず仮の最小値(0番目の値)kosuu[min]と1番目の値kosuu[1]のどちらが小さいかを比べ、もしkosuu[1]の方が小さければ、最小値を表す変数minに新たに配列番号1を記憶させておきます。逆に、仮の最小値(0番目の値)kosuu[min]の方が小さければ、仮の最小値kosuu[min]はそのまま(minに0が入ったまま)にします。ここでは、kosuu[0](12)よりもkosuu[1](10)が小さいので、kosuu[1]が新たな仮の最小値となります。

その後、次の繰り返しが始まります。今度はjの値がまた1増えるので、kosuu[j]はkosuu[2]に移動します。そして、仮の最小値kosuu[min]と2番目の値kosuu[2]を比べて、再びどちらが小さいのかを決めることになります。

このような作業をjがNになるまで繰り返します(j<Nの間繰り返す)。そして、最終的にはkosuu[min]に、本当の最小値が入ることになります。

 

次は、見つけた最小値(今は6番目)とi番目(今は0番目)を入れ替える作業に入ります。

 

(4)内側の繰り返し(最小値を探し出す)作業が終われば、外側の繰り返しに戻り、配列のi番目(今は0番目)と最小値(今は6番目)を入れ替えます。次が入れ替えの部分です。

dumy=kosuu[i];
kosuu[i]=kosuu[min];
kosuu[min]=dumy;

ここでは、dumyという一時保管用の変数を新たに使います。(なぜ、kosuu[i]=kosuu[min];kosuu[min]=kosuu[i];にしないかというと、いきなりkosuu[i]=kosuu[min];で、kosu[i]にkosuu[min]を入れてしまうと、kosuu[i]が上書きされてしまい、もともとkosuu[i]に入っていた値がなくなってしまいます。結果的に、次のkosuu[min]=kosuu[i];の作業では、上書きされた値がkosuu[min]に入るという、困った現象が起こってしまいます。よって、一時的にデータを保存する場所dumyが必要なのです。)

 

これで、i番目(0番目)の配列要素とmin番目(6番目)の配列要素が入れ替わります。よって、配列の0番目は確定しました。

(5)そして、外側のループの2回目で、iの値は1(kosuu[1])になり、今度は配列の1番目を、同じ要領で確定していくことになります。(再び内側ループに入り、残りの中で次の最小値を探し出します。)

この作業は、iの値がN-1になるまで繰り返します(i<N-1の間繰り返す)。(N-1を使うのは、iをNにしてしまうと、jがN+1になってしまい、エラーが起こるからです。)

これで、配列の中身を並び替えることができました。

※ 並び替えの部分は変数名を変えたりすれば、再度利用できます。基本選択法の並び替えの仕組みをしっかりと理解して、使いこなしましょう。

<プログラムの流れ>

フローチャートは、次のようになります。

 

新しい記号が出てきました。ここで確認しましょう。

では、実際におにぎりの売り上げ個数を順番に並び替えてみましょう。

実際に作ろう!