如何找到第二个最小的元素

时间:2014-04-09 12:24:16

标签: c++ algorithm

如果我输入例如5 4 3 2 1它给出1和2这是正确的但是如果我输入1 2 3 4 5它给出1和5这是错误的......如何解决这个问题?

该程序通过输入找到最小和最小的元素。

#include<iostream>
/*This program finds the smallest and second smallest elements through input*/
using namespace std;
/*This program finds the smallest and second smallest elements through input*/

int main(){
    float input_from_user=0.0, largest=0.0, smallest_num=0.0, runners_up=0.0;
    int count, i;

    cout<<"how many swimming records?"<<endl;
    cin>>count;
    cout<<"enter time: ";
    cin>>input_from_user;
    smallest_num=input_from_user;
    largest=input_from_user;
    for (i=1;i<=count;i++){
        cout<<"enter time: "<<endl;
        cin>>input_from_user;

        /*Compare smallest number with latest input*/
        if (smallest_num>input_from_user){
            runners_up=smallest_num;
            smallest_num=input_from_user;

        }


    }
    cout<<"First:"<<smallest_num<<endl;
    cout<<"Runners up: "<<runners_up<<endl;

    return 0;
}

2 个答案:

答案 0 :(得分:2)

/*Compare smallest number with latest input*/
if (smallest_num>input_from_user){
    runners_up=smallest_num;
    smallest_num=input_from_user;

}

上面的代码看起来像是问题。

如果input_from_user大于最小数量但小于 runner_up,则应更新runner_up。

/*Compare smallest number with latest input*/
if (runner_up > input_from_user){
    if(smallest_num > input_from_user) {
        runners_up=smallest_num;
        smallest_num=input_from_user;
    } else runners_up=input_from_user;

}

答案 1 :(得分:0)

最简单的方法是执行以下操作:

vector<float> tms;
for (i=1;i<=count;i++){
        cout<<"enter time: "<<endl;
        cin>>input_from_user;
        tms.push_back(input_from_user);
}
sort(tms.begin(), tms.end());

cout<<"First:"<< tms[0] <<endl;
cout<<"Runners up: "<< tms[1] <<endl;

此代码在访问元素之前只缺少一些长度检查。

这不是最佳的,因为它对所有元素进行排序,因此有另一种方法而不是排序 - 使用额外的&#34; set&#34;只排序那些有可能在最坏的情况下排在第二小的元素。在最好的情况下,它只需要前两个而不执行任何其他操作,在最坏的情况下,它将像以前一样对所有元素进行排序。

set<float> out;
out.insert(v[0]);
out.insert(v[1]);

for (auto x = v.begin() + 2; x != v.end(); ++x)
{
    auto second = ++out.begin();
    if ( *x < *second )
        out.insert(*x);
}

auto p = out.begin();
cout << "Smallest: " << *p;
++p;
cout << " Second: " << *p << endl;

您可以随时正确定义算法&#34;,但上述方法可以更快地开发和调试代码。