#include <stdio.h>
void main()
{
int n,i,max,max2,a[1000]
printf("输入数据,以负数结束:\n")
for(n=01n++)
{
scanf("%d",&a[n])
if(a[n++]<0)break
}
max=max2=a[0]
for(i=1i<ni++)
if(a[i]>max){max2=maxmax=a[i]}
else if(a[i]>max2)max2=a[i]
printf("第二大的数是 %d\n",max2)
getch()
return 0
}
呵呵。这是一个很经典的算法。你百度一下找第K小或者第K大的数。去看看。我分析下思路:
2轮冒泡,可以找出第二大数。
2轮循环。也可以找出第二大的。
你要到公司面试,要讲效率的话。可以看看我写的下面这个代码
这是用快速排序,夹逼原则来锁定要找的第K大的元素
void swape(int *p1,int *p2)
{
int temp
temp=*p1
*p1=*p2
*p2=temp
}
int searchPosition(int a[10],int start,int end)
{
int pivot=a[start]
while(start<end)
{
while(start<end&&a[end]>=pivot)
end--
if(start!=end)
{
swape(&a[start],&a[end])
start++
}
while(start<end&&a[start]<=pivot)
start++
if(start!=end)
{
swape(&a[start],&a[end])
end--
}
}
return start
}
int sloving(int a[10],int m)
{
int part=searchPosition(a,0,9)
while(m!=part+1)
{
if(m<part+1)
part=searchPosition(a,0,part)
else
part=searchPosition(a,part+1,9)
}
return part
}
Dev-C++ 测试通的!
MIT算法导论书上专门有讨论的。好像是……&
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)