结构体排序 sort与qsort

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
//按照	分数 降序(大到小)
//		做出题目数 降序(大到小)
// 		耗时 升序(小到大) 
//		姓名 字典序(升序)(小到大) 
//排序 
typedef struct aaa{
	char name[20];//名字 
	int s,cnt,t;//分数  做出题目数   耗时 
}student;
/*
strcmp(str1,str2)
若str1==str2,则返回零;
若str1<str2, 则返回负数;
若str1>str2, 则返回正数;
*//*
	< 是升序(小到大)(左面小右面大)
	> 是降序 
*/
//返回类型bool也可以 
int cmp1(student a,student b){
	if(a.s != b.s)		return a.s > b.s;				//分数 降序(大到小)
	if(a.cnt != b.cnt)	return a.cnt > b.cnt;			//做出题目数 降序(大到小)
	if(a.t != b.t)		return a.t < b.t;				//耗时 升序(小到大)
	else 				return strcmp(a.name,b.name)<0;	//姓名 字典序(升序)(小到大)
	//else可以去掉
}
/*
//sort与qsort相反 
前-后(第1个数减第2个数) 是升序
后-前 是降序 
*/
int cmp2(const void* a, const void* b){
	student *pa=(student*)a,*pb=(student*)b;
	int s1=pa->s,s2=pb->s;
	if(s1!=s2) 			return s2-s1;						//分数 降序(大到小)
	if(pa->cnt!=pb->cnt)return pb->cnt-pa->cnt;				//做出题目数 降序(大到小)
	if(pa->t!=pb->t)	return pa->t-pb->t;					//耗时 升序(小到大)
						return strcmp(pa->name,pb->name); 	//姓名 字典序(升序)(小到大)
}
int main(){
	student x[15];
	int n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)scanf("%s %d %d %d",&x[i].name,&x[i].s,&x[i].cnt,&x[i].t);
	
	//二选一_______________________________ 
	
	//sort(x,x+n,cmp1);
	qsort(x,n,sizeof(student),cmp2);
	
	cout<<endl;
	for(i=0;i<n;i++)
		cout<<x[i].name<<' '<<x[i].s<<' '<<x[i].cnt<<' '<<x[i].t<<endl;
	return 0;
}
/*数据 
15
aaa 50 4 77
abc 60 2 30
bbb 80 8 15
kdhj 12 9 2
sso 80 8 21
six 100 20 60
ssd 0 0 0
wzx 9999 999 1
lld 50 3 52
ten 80 7 99
eleven 80 7 3
dfh 80 7 3
ujk 55 5 5
yhj 33 65 41
fifteen 60 2 30

*/
/*结果
wzx 9999 999 1
six 100 20 60
bbb 80 8 15
sso 80 8 21
dfh 80 7 3
eleven 80 7 3
ten 80 7 99
abc 60 2 30
fifteen 60 2 30
ujk 55 5 5
aaa 50 4 77
lld 50 3 52
yhj 33 65 41
kdhj 12 9 2
ssd 0 0 0
*/
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值