知识点:
当然,第三个排序的法则可以自己写,即cmp函数。。。
cmp函数的写法:
桶排序:是一种计数的思想(不光可用于排序),首先,我们需要准备好足够的桶(要高于所读取数据的最大值),然后依次读取数据,在对应数据的桶上打上标记,这样操作完之后,就可以实现把数据按序输出。
习题
谁考了第k名-排序
#include <bits/stdc++.h>
using namespace std;
struct student
{
int xuehao;
double grade;
}stu[200];
int cmp(const struct student &a,const struct student &b )
{
return a.grade>b.grade;
}
int main()
{
int n,k;
while(cin>>n>>k)
{
for(int i=0;i<n;i++)
{
cin>>stu[i].xuehao>>stu[i].grade;
}
sort(stu+1,stu+1+n,cmp);
printf("%d %g\n",stu[k].xuehao,stu[k].grade);
}
return 0;
}
奇数单增序列
#include <bits/stdc++.h>
using namespace std;
int cmp(const int &a,const int &b)
{
return a<b;
}
int main()
{
int n;
while(cin>>n)
{
int x[n],y[n],k;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
for(int i=0;i<n;i++)
{
y[i]=0;
}
k=0;
for(int i=0;i<n;i++)
{
if(x[i]%2!=0)
{
y[k]=x[i];
k++;
}
}
sort(y,y+k,cmp);
for(int i=0;i<k-1;i++)
{
cout<<y[i]<<",";
}
cout<<y[k-1]<<endl;
}
return 0;
}
成绩排序
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[20];
int grade;
}stu[25];
int cmp(const struct student &a,const struct student &b)
{
if(a.grade!=b.grade)
return a.grade>b.grade;
else
return strcmp(a.name,b.name)<0;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>stu[i].name>>stu[i].grade;
}
sort(stu,stu+n,cmp);
for(int i=0;i<n;i++)
{
cout<<stu[i].name<<" "<<stu[i].grade<<endl;
}
}
return 0;
}
没必要的排序1
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,x[2],sum;
while(cin>>n>>k)
{
int t,p;//t用来接收数,p作为排序之后数组的下标//
int y[n];//排序后的数组//
for(int i=0;i<n;i++)
y[i]=0;//为排序后数组清空//
for(int i=0;i<2;i++)
x[i]=0;//清空就收数的数组//
for(int i=0;i<n;i++)
{
cin>>t;
x[t]++;
}
p=0;
for(int i=1;i>=0;i--)
{
for(int j=1;j<=x[i];j++)
{
y[p]=i;
p++;
}
}
sum=0;
for(int i=0;i<k;i++)
sum+=y[i];
cout<<sum<<endl;
}
return 0;
}
没必要的排序2
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,j,sum;
while(scanf("%d%d",&n,&k)!=EOF)
{
int x[100001]={0};
int t;
j=1,sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
x[t]++;
}
for(int i=100000;i>=1;i--)
{
for(int p=1;p<=x[i];p++)
{
sum+=i;
j++;
if(j==k+1)
break;
}
if(j==k+1)
break;
}
printf("%d\n",sum);
}
//cout << "Hello world!" << endl;
return 0;
}
老和尚的导员
#include <bits/stdc++.h>
using namespace std;
struct student
{
int a,b,c,d,sum,num;
}stu[105];
int cmp(const struct student &a,const struct student &b)
{
if(a.sum!=b.sum)
return a.sum>b.sum;
else
{
if(a.a!=b.a)
return a.a>b.a;
else
{
if(a.b!=b.b)
return a.b>b.b;
else
{
if(a.c!=b.c)
return a.c>b.c;
else
{
if(a.d!=b.d)
return a.d>b.d;
}
}
}
}
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
cin>>stu[i].a>>stu[i].b>>stu[i].c>>stu[i].d;
stu[i].num=i;
stu[i].sum=stu[i].a+stu[i].b+stu[i].c+stu[i].d;
}
sort(stu+1,stu+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<stu[i].num<<" "<<stu[i].sum<<endl;
}
return 0;
}
健忘的老和尚
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[100];
int grade;
}stu[100];
int cmp(const struct student &a,const struct student &b)
{
return a.grade>b.grade;
}
int main()
{
int n,m,o;
while(cin>>n>>m>>o)
{
for(int i=0;i<n;i++)
{
cin>>stu[i].name>>stu[i].grade;
}
sort(stu,stu+n,cmp);
for(int i=m-1;i>=0;i--)
cout<<stu[i].name<<endl;
for(int i=n-1;i>n-1-o;i--)
cout<<stu[i].name<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}
戏说三国
#include <bits/stdc++.h>
using namespace std;
struct member
{
char name[20];
double zy,dy,wy,zcj;//折合后的分数与总成绩//
int z,d,w;//折合前的分数//
}mem[100005];
bool cmp(const struct member &a,const struct member &b)
{
if(a.zcj!=b.zcj)
return a.zcj>b.zcj;
else
{
if(a.zy!=b.zy)
return a.zy>b.zy;
else
{
if(a.dy!=b.dy)
return a.dy>b.dy;
else
{
if(a.wy!=b.wy)
return a.wy>b.wy;
}
}
}
}
int main()
{
int t,n;
double a,b,c;
while(cin>>t)
{
for(int j=1;j<=t;j++)
{
cin>>n>>a>>b>>c;
for(int i=1;i<=n;i++)
{
cin>>mem[i].name>>mem[i].z>>mem[i].d>>mem[i].w;
mem[i].zcj=mem[i].z*(b/100)+mem[i].d*(a/100)+mem[i].w*(c/100);
mem[i].zy=mem[i].z*(b/100);
mem[i].dy=mem[i].d*(a/100);
mem[i].wy=mem[i].w*(c/100);
}
sort(mem+1,mem+1+n,cmp);
printf("Case #%d:\n",j);
for(int i=1;i<=n;i++)
{
cout<<mem[i].name<<" ";
printf("%.4lf %.4lf %.4lf %.4lf\n",mem[i].zcj,mem[i].zy,mem[i].dy,mem[i].wy);
}
}
}
return 0;
}
相约摩洛哥
#include <bits/stdc++.h>
using namespace std;
struct party
{
char name[30];
int t[4],a[4];
int ac,time;
}p[100001];
bool cmp(const struct party &a,const struct party &b)
{
if(a.ac!=b.ac)
return a.ac>b.ac;
else if(a.time!=b.time)
return a.time<b.time;
}
int main()
{
int n;
while(scanf("%d",&n)!=-1)
{
for(int i=1;i<=n;i++)
{
scanf("%s%d%d%d",p[i].name,&p[i].t[1],&p[i].t[2],&p[i].t[3]);
}
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].a[1],&p[i].a[2],&p[i].a[3]);
}
for(int i=1;i<=n;i++)
{
p[i].ac=0;
p[i].time=0;
for(int j=1;j<=3;j++)
{
if(p[i].t[j]!=-1)
{
p[i].ac++;
p[i].time=p[i].time+p[i].t[j]+20*(p[i].a[j]-1);
}
}
}
sort(p+1,p+1+n,cmp);
for(int i=1;i<=n;i++)
{
printf("%s %d %d\n",p[i].name,p[i].ac,p[i].time);
}
}
return 0;
}
结构体排序题一
#include <bits/stdc++.h>
using namespace std;
struct dian
{
int h,z;
}d[100];
bool cmp1(dian a,dian b)//0 0排序//
{
if(a.h!=b.h)
return a.h>b.h;
else
return a.z>b.z;
}
bool cmp2(dian a,dian b)//0 1排序//
{
if(a.h!=b.h)
return a.h>b.h;
else
return a.z<b.z;
}
bool cmp3(dian a,dian b)//1 0排序//
{
if(a.h!=b.h)
return a.h<b.h;
else
return a.z>b.z;
}
bool cmp4(dian a,dian b)//1 1排序//
{
if(a.h!=b.h)
return a.h<b.h;
else
return a.z<b.z;
}
int main()
{
int n,x,y;
while(scanf("%d%d%d",&x,&y,&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d%d",&d[i].h,&d[i].z);
}
if(x==0&&y==0)
sort(d+1,d+1+n,cmp1);
if(x==0&&y==1)
sort(d+1,d+1+n,cmp2);
if(x==1&&y==0)
sort(d+1,d+1+n,cmp3);
if(x==1&&y==1)
sort(d+1,d+1+n,cmp4);
for(int i=1;i<=n;i++)
printf("(%d,%d)\n",d[i].h,d[i].z);
}
//cout << "Hello world!" << endl;
return 0;
}