整列(ソート)とは、ランダムに並んでいるデータをある規則にしたがって並べ替えることである。小さい順を昇順、大きい順を降順という。ここでは、最もアルゴリズムが容易な基本交換法(バブルソート)を用いて、一次元配列に格納された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*/
}
}
/*ここに配列を表示する文を挿入すると、ソートの経過をトレースすることができる*/
}
}
[実行結果]
流れ図
次へ