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

时间:2016-03-22 16:19:43

标签: c++ arrays

我有一个数组,其中包含0到99之间的5个随机数。我想找到该数组的最小和第二小数,我有下面的代码但是如果第一个元素是最小的数字。我怎样才能解决这个问题?感谢您的任何帮助! :)

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

编辑:这需要在不根据作业要求对数组进行排序的情况下完成。

6 个答案:

答案 0 :(得分:2)

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

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

secondSmallest更改为smallest的内容,即numbers[0],因此它仍然可以使用。

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

答案 1 :(得分:2)

另一种在不使用两个循环的情况下完成此操作的方法。照顾重复。

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

答案 2 :(得分:1)

如果出现以下情况,请在您的其他地方尝试以下内容:

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

答案 3 :(得分:1)

我会尝试将secondSmallest数字初始化为最大数字,例如99。 (即使所有5个数字随机变为99,第二个最小数字仍为99.)

答案 4 :(得分:1)

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

您可以使用最大数量初始化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

答案 5 :(得分:1)

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

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