我有四个参数,每个都是一个整数,我想找到最小的参数。什么是最快捷和/或最简单的方法?我可以做一个泡泡排序,但它似乎有点过分。
答案 0 :(得分:10)
int min(int a, int b){
return a<b?a:b;
}
致电:
min(min(a,b),min(c,d))
答案 1 :(得分:6)
如果您只查找最大和/或最小值,请遍历完整列表,跟踪到目前为止您看到的最小值和最大值。无需搜索。
例如:
void print_min_max(int list[], int len)
{
int max = INT_MIN, min = INT_MAX;
int i;
for (i=0; i<len; i++) {
if (list[i] < min) min = list[i];
if (list[i] > max) max = list[i];
}
printf("min=%d, max=%d\n", min, max);
}
答案 2 :(得分:2)
最快的方式...... 以下方法尚未与其他速度方法进行比较,但如果您想在不使用三元运算符(避免分支)或循环的情况下找到min或max,则可以定义这些函数:
int min(int x,int y)
{
return y ^ ((x ^ y) & -(x < y)); // min(x, y)
}
int max(int x,int y)
{
return x ^ ((x ^ y) & -(x < y)); // max(x, y)
}
int main()
{
int minn, maxx;
//evaluating pairs
minn = min(3,6);
maxx = max(3,6);
//evaluating multiple values:
minn = min(9,min(8,min(2,5)));//expand as needed
maxx = max(9,max(8,max(2,5)));
return 0;
}
关于效率的注意事项:关于三元运算符方法,我认为对现代编译器的编译器优化可能会消除三元运算符固有的分支,使得该技术的使用不成问题(关于速度)无论如何)。
答案 3 :(得分:2)
int FindMin(int a, int b, int c, int d) {
int min1 = (a>b)?b:a;
int min2 = (c>d)?d:c;
return (min1>min2)?min2:min1;
}