在C++中查找数组的最小值和第二小值
finding smallest and second smallest value of an array in C++
我有一个数组,它将包含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。)
这可以通过两种方式解决。
您可以用最大的数字初始化smallest
和secondSmallest
:
#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];
}
}
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用递归的数组的最小值.这是怎么回事
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- txt 文件中浮点数的最大和最小值
- 余数运算符的等效操作,用于处理低于允许的最小值
- 需要使用模板查找数组的第二个最小和最小值
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 查找包含 N 个元素的数组的最小值和最大值
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- 将最小值整数转换为无符号长整型
- 查找 std::vector 中的最小值和最大值 std::p air
- 如何找到每行的最大值和最小值
- 在不进行排序的情况下查找数组中n个最小值的索引