7−2 一次元配列を用いた整列

整列(ソート)とは、ランダムに並んでいるデータをある規則にしたがって並べ替えることである。小さい順を昇順、大きい順を降順という。ここでは、最もアルゴリズムが容易な基本交換法(バブルソート)を用いて、一次元配列に格納されたint型データを昇順に並べ替える。

 

例題

int型配列dataに下図のようにN個(N=10)のデータが格納されている時、基本交換法を用いてデータを昇順に整列する。

検索は以下の手順で行う。

@配列の先頭から順にとなり合うデータをひかくし、data[j]<data[j+1]となるようにデータを交換する。その結果最大のデータが順に後ろに送られ、いちばん右のデータdata[N-1]が最大となる。

A再び先頭のデータから@の処理を行うがdata[N-1]は、すでに最大であることがわかっているため、data[N-2]までのデータについてこの処理を行えばよい。その結果data[N-2]は、2番目に大きなデータとなる。

B以上の処理を繰り返し、比較・交換処理が1回(data[0]とdata[1])となったとき、この比較・交換を行った後、処理を終了する。

Cただし、比較を行った結果、途中で一度も交換が行われなければ、すでに全データは昇順に並んでおり、処理を終了する。

[プログラムの作成]

/*-----------------------------------------------

       基本交換法

-------------------------------------------------*/

#include<stdio.h>

#define ON   1    /*sw:交換が行われた*/

#define OFF  0    /*sw:交換が行われていない*/

#define N   10    /*データの個数*/

 

main()

{

   int  data[N]={15,24,33,56,13,95,34,55,80,90};  /*データ群*/

   int  i,j;  /*添字*/

   int  tmp;  /*作業領域*/

   int  sw;  /*交換が行われたか?*/

/*整列*/

sw=ON;

for(i=N-2;i>=0 && sw== ON; i--){

     sw =OFF            /*sw:最初はOFF*/

     for(j=0;j<=i;j++){       /*data[j]<data[j+1]となるようにする*/

          if(data[j]>data[j+1]){

             tmp=data[j];  /*交換*/

             data[j]=data[j+1];

             data[j+1]=tmp;

             sw = ON;    /*sw:一回でも交換をしたらON*/

           }

      }

     /*ここに配列を表示する文を挿入すると、ソートの経過をトレースすることができる*/

     }

}

 

[実行結果]

 

 

 

流れ図

 

 

次へ