在数组中查找最小值和最大值时应使用哪种方法?

时间:2019-01-22 09:29:15

标签: c

我想知道在数组中找到最小值和最大值的最佳方法是什么。我使用两种方法(我的数组是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中解决的,这三种方法中哪一个是最佳的,为什么?

感谢所有回复!

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];
}

UPD

我真的很惊讶地看到人们认为方法1不适用于负数。 ,因为在第一次迭代中,当选中i==0时,我们总是使用第一个元素初始化minmax。如有疑问,我建议按负序运行此代码-它可以正常工作(我已经检查过了)

答案 2 :(得分:1)

第二和第三方法是更好的方法。我个人认为第三解决方案比第二解决方案更好。