我正在尝试在具有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;
}
答案 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;
,然后再打印i
即1
,因此它显示为2;1
,在这里您认为它正在打印{ {1}}个数字。
主要问题是您的2
语句仅在第一次迭代中终止for循环。