您的位置:首页 > 其它

找出数组中第二大的数

2015-07-25 21:32 357 查看
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

//初始化最大值为a[0],次大值为a[1],遍历一次,每次比较并更新最大值和次大值,最后就可以得到次大值。   这种方法时间复杂度为O(n)
bool InvalidInput=false;
int FindSecondMax(int a[],int n)
{
if(n<2||a==NULL)
{
return 0;
InvalidInput=true;
}
int max=a[0];
int secondMax=a[1];
for(int i=0;i<n;i++)
{
if(max<a[i])
{
secondMax=max;//原先的最大值变为次大值
max=a[i];
}
else if(a[i]<max&&a[i]>secondMax)
{
secondMax=a[i];
}
}
if(secondMax!=max)//去重 防止出现最大值和最小值一样的情况 如a[]={3,3,3};
{
return secondMax;
}
else
{
return 0;
InvalidInput=true;
}
}

//方法二先对数组排序再取倒数第二个数。最笨的就是这个方法了。时间复杂度为排序的时间复杂度
int FindSecondMax2(int a[],int n)
{
if(n<2||a==NULL)
{
return 0;
InvalidInput=true;
}
bool flag=true;
for(int i=0;i<n-1&&flag;i++)
{
flag=false;
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
flag=true;
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}

}
if(a[n-2]!=a[n-1])
{
return a[n-2];
}
else
{
int i=n-2;
while(i>=0&&a[i]==a[n-1])
{
i--;
}
if(i>=0)
{
return a[i];
}
else
{
return 0;
InvalidInput=true;
}
}
}
int main(void)
{
int a[] = {2,3,3,3,2,2,2};
printf("second value = %d\n",FindSecondMax2(a,sizeof(a)/sizeof(a[0])));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: