ここでは2つの例を載せる。
この方法は単純である。
3つの数字の組み合わせは6通りしかないので、その6通りの条件を全部判定する方法である。
最後の1通りだけは、条件を判定する必要はない。
このやり方は、最も少ないケースでは2回の比較で結果が出るが、最も多いケースでは10回の比較を行う必要がある。
c002-1.c
#include <stdio.h>
int main(void){
int a,b,c;
printf("Input 3 integers:");
scanf("%d%d%d",&a,&b,&c);
if(a<=b && b<=c)
printf("%d %d %d\n",a,b,c);
else if(a<=c && c<=b)
printf("%d %d %d\n",a,c,b);
else if(b<=a && a<=c)
printf("%d %d %d\n",b,a,c);
else if(b<=c && c<=a)
printf("%d %d %d\n",b,c,a);
else if(c<=a && a<=b)
printf("%d %d %d\n",c,a,b);
else
printf("%d %d %d\n",c,b,a);
return 0;
}
MAX(a,b)とMIN(a,b)という2つのマクロを定義して、それを使って最大値と最小値を探し、その後に中央値を探す方法である。
この方法では、ケースに寄らず常に8回の比較を行う。
#include <stdio.h>
#define MAX(a,b) ((a>b)?(a):(b))
#define MIN(a,b) ((a<b)?(a):(b))
int main(void){
int a,b,c;
int max,mid,min;
printf("Input 3 integers:");
scanf("%d%d%d",&a,&b,&c);
max=MAX(a,b); // 最も大きい数をmaxに
max=MAX(max,c);
min=MIN(a,b); // 最も小さい数をminに
min=MIN(min,c);
mid=a; // とりあえず中央の数をaにしておき、
if(max!=b && min!=b) mid=b; // もし最大も最小もbでないなら中央をbに
if(max!=c && min!=c) mid=c; // もし最大も最小もcでないなら中央をcに
printf("%d %d %d\n",min,mid,max);
return 0;
}
この方法は、最初の方法と似ているが、不必要な条件判断をなるべく排除する方法である。
最初のプログラムは、6つのケースですべての大小関係を比較している。これはもちろん無駄である。
2番目のプログラムは少し無駄を排除したが、例えばmaxが求まってからminを求めるのに、maxを排除せずもう一度3つの数値を比較している。これは無駄である。
このプログラムでは、すでに大小関係が判明している場合はそれを使うようにしているため、比較回数に無駄がない。
この方法では、最小で2回、最大でも3回の比較で結果を出すことができる。
よって、ソースコードは多少長くて間延びしているが、最も効率の良い方法であるといえる。
#include <stdio.h>
int main(void){
int a,b,c;
int max,mid,min;
printf("Input 3 integers:");
scanf("%d%d%d",&a,&b,&c);
if(a<=b){
if(b<=c){
min=a; mid=b; max=c; // a<b<c
}
else if(a<=c){
min=a; mid=c; max=b; // a<c<b
}
else{
min=c; mid=a; max=b; // c<a<b
}
}
else{
if(a<=c){
min=b; mid=a; max=c; // b<a<c
}
else if(b<=c){
min=b; mid=c; max=a; // b<c<a
}
else{
min=c; mid=b; max=a; // c<b<a
}
}
printf("%d %d %d\n",min,mid,max);
return 0;
}