一道关于成绩排名的编程题目,求指导,表示看不懂他的算法
#include<iostream>
using namespace std;
void ranking(int a[],int b[]);
int main(void)
{
int a[101],b[101],i,n;
cout<<"请输入参赛选手的人数:"<<endl;
cin>>n;
a[0]=b[0]=n;
cout<<"请输入"<<n<<"个选手的成绩:"<<endl;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=0;
}
ranking(a,b);
cout<<n<<"个选手的成绩和名次依次为:"<<endl;
for(i=1;i<=n;i++)
cout<<a[i]<<" "<<b[i]<<endl;
return 0;
}
void ranking(int a[],int b[])
{
int t[101];
int i,j,k,n,max,rank;
n=a[0];
for(i=1;i<=n;i++)
b[i]=0;
rank=1;
i=1;
while(i<=n)
{
if (b[i]==0)
{
max=a[i];
k=1;
t[k]=i;
for(j=i+1;j<=n;j++)
{
if (b[j]==0&&a[j]>=max)
{
if(a[j]>max)
{
max=a[j];
k=0;
}
k=k+1;
t[k]=j;
}
}
for(j=1;j<=k;j++)
b[t[j]]=rank;
rank=rank+k;
continue;
}
i++;
}
}
编程
[解决办法]
先帮忙把代码格式化下吧:
#include<iostream>
using namespace std;
void ranking(int a[],int b[]);
int main(void)
{
int a[101],b[101],i,n;
cout<<"请输入参赛选手的人数:"<<endl;
cin>>n;
a[0]=b[0]=n;
cout<<"请输入"<<n<<"个选手的成绩:"<<endl;
for(i=1; i<=n; i++)
{
cin>>a[i];
b[i]=0;
}
ranking(a,b);
cout<<n<<"个选手的成绩和名次依次为:"<<endl;
for(i=1; i<=n; i++)
cout<<a[i]<<" "<<b[i]<<endl;
return 0;
}
void ranking(int a[],int b[])
{
int t[101];
int i,j,k,n,max,rank;
n=a[0];
for(i=1; i<=n; i++)
b[i]=0;
rank=1;
i=1;
while(i<=n)
{
if (b[i]==0)
{
max=a[i];
k=1;
t[k]=i;
for(j=i+1; j<=n; j++)
{
if (b[j]==0&&a[j]>=max)
{
if(a[j]>max)
{
max=a[j];
k=0;
}
k=k+1;
t[k]=j;
}
}
for(j=1; j<=k; j++)
b[t[j]]=rank;
rank=rank+k;
continue;
}
i++;
}
}
void ranking(int a[],int b[])
{
int iNum = a[0];
//找到最高分
int maxHigh=0;
for(int i =1; i <= iNum; ++i){
if(a[i] > maxHigh)
maxHigh = a[i];
}
//利用计数排序
int *C = new int[1+maxHigh];
for(int i =0; i <= maxHigh; ++i){
C[i] = 0;
}
for(int i =1; i <= iNum; ++i){
++C[a[i]];
}
for(int i = 0; i < maxHigh; ++i){
C[i+1] += C[i];
}
//开始保存名次
for(int i =1; i <= iNum; ++i){
b[i] = iNum + 1 - (C[a[i]]--);
}
}
void sortidx(const int* arr, int* idx, int n)
{
int i, j, temp;
for (i = 1; i < n; i++)
{
temp = idx[i];
for (j = i - 1; j >= 0; j--)
{
if (arr[temp] < arr[idx[j]])
idx[j + 1] = idx[j];
else
break;
}
idx[j + 1] = temp;
}
}