ソート法
概要
データ列をある規則にしたがって並べ替えることを、ソート(Sort)といいます。そして、1,2,5,7,・・・というように数の小さい順に並べることを昇順といい、逆に、・・・,7,5,2,1と数の大きい順に並べることを降順といいます。
--------------------------------------------
●ソートの分類
--------------------------------------------
ソート法には、次のような方法があります。
(1)直接選択法
(2)バブル・ソート
(3)クイック・ソートなど
この内、(1)と(2)の方法について、プログラム例を示します。
--------------------------------------------
●直接選択法(昇順の場合)
--------------------------------------------
数列から最大(最小)を探すことを繰り返す。
比較回数は多いが交換回数が少ない。
#include<stdio.h>
#define N 5
main()
{
int x[N] = {3,4,1,5,2};
int i,j,min,id,z;
printf("[s] : ");
for(i=0;i<N;i++)
printf("
%d",x[i]);
printf("\n");
for(i=0;i<N-1;i++){
min
= x[i];
id
= i;
printf("
id:%d, min:%d\n",id,min);
for(j=i+1;j<N;j++){
if(min>x[j]){
min
= x[j];
id
= j;
printf("
id:%d, min:%d\n",id,min);
}
}
z
= x[i];
x[i] = min;
x[id]
= z;
printf(" (%d) <->
(%d)\n",z,min);
printf("[%d]
: ",i);
for(j=0;j<N;j++)
printf("
%d",x[j]);
printf("\n");
}
printf("[e]
: ");
for(i=0;i<N;i++)
printf("
%d",x[i]);
printf("\n");
}
--------------------------------------------
●バブル・ソート(昇順の場合)
--------------------------------------------
隣接する2項を逐次交換する。
原理は簡単だが、交換回数が多い。
#include<stdio.h>
#define N 5
main()
{
int x[N] = {5,3,1,4,2};
int i,j,z;
printf("[s] : ");
for(i=0;i<N;i++)
printf("
%d",x[i]);
printf("\n");
for(i=0;i<N-1;i++){
for(j=N-1;j>i;j--){
if(x[j]<x[j-1]){
printf("
(%d)(%d) -> ",x[j-1],x[j]);
z = x[j];
x[j]
= x[j-1];
x[j-1]
= z;
printf("(%d)(%d)\n",x[j-1],x[j]);
}
}
printf("[%d]
: ",i);
for(j=0;j<N;j++)
printf("
%d",x[j]);
printf("\n");
}
printf("[e]
: ");
for(i=0;i<N;i++)
printf("
%d",x[i]);
printf("\n");
}