我想知道在数组中找到最小值和最大值的最佳方法是什么。我使用两种方法(我的数组是a
,大小为size
):
方法1:
int min = 0, max = 0;
for(int i = 0; i < size; i++)
{
if(a[i] > max || i == 0) max = a[i];
if(a[i] < min || i == 0) min = a[i];
}
方法2:
int min = INT_MAX, max = INT_MIN;
for(int i = 0; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
方法3:
int min = a[0], max = a[0];
for(int i = 1; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
对于新手来说,方法2似乎更合适(我们不必每次循环迭代都评估i == 0
2次。但是,恐怕使用这些极限值可能会出错。这是在方法3中解决的,这三种方法中哪一个是最佳的,为什么?
感谢所有回复!
答案 0 :(得分:3)
尝试第三个选项。这是最佳选择,因此您不必处理极限值。
答案 1 :(得分:3)
方法1适合所有情况,因此,如果您在编写代码时不考虑特殊上下文,我会使用它。
方法2取决于变量的类型。如果将其从int32
更改为任何值,则必须重写该程序。无符号类型0
的btw是最小值,无法定义任何特殊常量。
方法3要求您的序列(数组)不为空,并且不进行其他长度检查就不能使用。
我喜欢方法3的这种修改:
// assuming size is of size_t and can't be negative
int min = size ? a[0] : 0;
int max = min;
for(int i = 1; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
我真的很惊讶地看到人们认为方法1不适用于负数。 会,因为在第一次迭代中,当选中i==0
时,我们总是使用第一个元素初始化min
和max
。如有疑问,我建议按负序运行此代码-它可以正常工作(我已经检查过了)
答案 2 :(得分:1)
第二和第三方法是更好的方法。我个人认为第三解决方案比第二解决方案更好。