在C++中查找数组的最小值和第二小值

finding smallest and second smallest value of an array in C++

本文关键字:最小值 C++ 查找 数组      更新时间:2023-10-16

我有一个数组,它将包含5个0到99之间的随机数。我想找到该数组的最小和第二小的数字,我有下面的代码,但如果第一个元素是最小的数字,它将不起作用。我该怎么解决这个问题?感谢您的帮助!:)

int numbers[5];
int main()
{
srand(time(NULL));
for(int i=0; i<5; i++){
    numbers[i]=rand()%100;
    cout<<numbers[i]<<" ";
}
cout<<endl;
int smallest = numbers[0], secondSmallest=numbers[0];
for(int i=0; i<5; i++){
    if(numbers[i]<smallest){
        secondSmallest=smallest;
        smallest=numbers[i];
    }
    else if(numbers[i]<secondSmallest)
        secondSmallest=numbers[i];
}
cout<<"Smallest number is : "<<smallest<<endl;
cout<<"Second smallest number is : "<<secondSmallest<<endl;
}

EDIT:这需要在不根据任务要求对数组进行排序的情况下完成。

还有一种不用两个循环就能完成这项工作的方法。处理重复项。

    int smallest = numbers[0],secondSmallest = numbers[0];
    for(int i=0;i<5;i++){
        if(numbers[i]>smallest){
            if(numbers[i]<secondSmallest || smallest==secondSmallest){
                secondSmallest = numbers[i];
            }
        }else{
            if(secondSmallest>smallest && numbers[i]!=smallest){
                secondSmallest=smallest;
            }
            smallest = numbers[i];
        }
    }

如果numbers[0]是最小的,那么您知道其他索引必须是第二小的。因此我们可以使用CCD_ 2。即使numbers[1]是最小的

if(numbers[i]<smallest){
    secondSmallest=smallest;
    smallest=numbers[i];
}

secondSmallest更改为smallest,也就是numbers[0],因此它仍然可以工作。

我们也可以使用<limits>中的std::numeric_limits,并将两个变量都设置为std::numeric_limits<int>::max(),这将使它们成为int可以存储的最大值。数组中的任何变量都不能大于该值,因此它们将等于或小于该值。

在您的else-if:中尝试类似的操作

else if(numbers[i]<secondSmallest && numbers[i] != smallest)
        secondSmallest=numbers[i];

我会尝试将secondSmallest数字初始化为最大数字,比如这里的99。(即使所有5个数字随机为99,第二个最小的数字仍然是99。)

这可以通过两种方式解决。

您可以用最大的数字初始化smallestsecondSmallest

#include<limits>
// ...
int smallest = std::numeric_limits<int>::max(), secondSmallest = smallest;

然后我会把你循环中的if语句改成这样:

for( int i = 0; i < 5; i++ ) {
    //          ^^^^^ use a std::vector and change that to i < numbers.size()
    if ( numbers[i] < secondSmallest ) {
        if ( numbers[i] < smallest ) {
            secondSmallest = smallest;
            smallest = numbers[i];
        } else {
            secondSmallest = numbers[i];
        }
    }
}

否则,如果您确定容器中至少有2个元素,则可以开始比较第一个元素:

int smallest = numbers[0], secondSmallest = numbers[1];
if ( numbers[1] < numbers[0] ) {
    secondSmallest = numbers[0];
    smallest = numbers[1];
} 

然后可以更改环路的启动条件:

for( int i = 2; i < numbers.size(); i++ ) { ...
//          ^^^ we have already compared the first ones

这可以通过分别查找最小值和次最小值并最初为它们分配不同的值来解决。
这是代码:

int smallest = numbers[0], secondSmallest=99; //max value to secondSmallest
for(int i=0; i<5; i++){
    if(numbers[i]<smallest){
        smallest=numbers[i];
    }
}
for(int i=0; i<5; i++){
    if(numbers[i]<secondSmallest && numbers[i]!=smallest){
        secondSmallest=numbers[i];
    }
}