为什么我的for循环只运行2次而不是10次?

时间:2019-12-29 17:01:09

标签: c++

我正在尝试在具有O(n)空间和时间复杂度的数组中找到第三高的数字。 我的程序显然是错误的,但这不是问题。 thirdhighestnum函数中的for循环似乎只运行2次。我似乎找不到原因。谁能帮我。抱歉,我是一个初学者。

#include<iostream>

using namespace std;

int thirdhighestnum(int a[],int size)
{ 
    cout<<" "<<size<<endl;
    int first=a[0],second=0,third=0;
    for(int i=1;i<size;i++)
    {
        cout<<a[i]<<";"<<endl;
        if(a[i]>first)
        {
            first=a[i]; 
            if(a[i+1]>first)
            {
                second=first;
                first=a[i+1];
                if(a[i+2]>first)
                {   third=second;
                    second=first;   
                    first=a[i+2];

                }
            }
            cout<<i<<endl
            return third;
        }
    }
}
int main()
{  int num,a[10];
    cout<<"Enter the elements in the array"<<endl;
    for(int i=0;i<10;i++)
        cin>>a[i];
    cout<<"Third highest number is "<<thirdhighestnum(a,10)<<endl;
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这是您的return third语句的位置。当任何数字大于第一个数字时,它将退出thirdhighestnum函数并返回一个值。将其放在for循环之外,应该没问题。

答案 1 :(得分:0)

这称为nth_element,库函数可以为您完成此操作。
至于代码为什么失败,逻辑上就有缺陷

for(int i=1;i<size;i++)
{
    // some code
    if(a[i]>first)
    {
        // some more code
        cout<<i<<endl
        return third;
    }
}

因此,您的代码在a [i]大于第一次时退出。

[编辑-阅读评论后]
这类算法的通用名称是QuickSelect。您不可能找到更快的算法,因为这是多年学术研究的主题。

答案 2 :(得分:0)

实际上,它仅执行一次时间,即仅执行第一次迭代。当i=1时,它打印a [1]即2;,然后再打印i1,因此它显示为2;1,在这里您认为它正在打印{ {1}}个数字。

主要问题是您的2语句仅在第一次迭代中终止for循环。