Poj2092 计数排序 求第K大的元素
题目大意: 统计出现的n个数,每个数的范围为1-10000,输出统计次数第二大的那个数
实现: 建立一个players[100001]的数组,当每个数n出现时就统计players[n]++, 然后最后找出最大的次数 max和第二大的次数secondNumber,
在players中元素值为secondNumber的元素的下标即为题目所要求的数.
注意:在统计第二大的数时,当一个数比max大时,该数成为新的max,原来的max值变为新的SecondNumber.
延伸: 求数组第K大的元素存在线性的查找时间,参考算法导论第二版 Chapter9
程序:
// POJ1411Enumeration.cpp : Defines the entry point for the console application.
//
#include<iostream>
#include<stdio.h>
#define maxNum 10001
int main(void)
{
int test_case,playerNumber;
int i,rank,max,secondNumber,temp;
int players[10010];
while(1)
{
std::cin>>test_case>>playerNumber;
if(test_case==0||playerNumber==0)
{
break;
}else
{
for(i=0;i<=10000;i++)
{
players[i]=0;
}
max=0;
secondNumber=0;
for(i=0;i<playerNumber*test_case;i++)
{
scanf("%d",&rank);
players[rank]++;
}
for(i=1;i<=10000;i++) //确定出现的第一大的数和第二大的数
{
temp=players[i];
if(temp>max)
{
secondNumber=max;
max=temp;
}else if(temp>secondNumber&&temp<max)
{
secondNumber=temp;
}
}
for(i=1;i<=10000;i++)
{
if(players[i]==secondNumber)
{
printf("%d ",i);
}
}
printf("\n");
}
}
return 0;
}