王道机试指南【九度OJ】题目1202:成绩排序

时间限制:1 秒  内存限制:32 兆 特殊判题:否
题目描述:
有 N 个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名
字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N
个学生排序后的信息。
输入:
测试数据有多组,每组输入第一行有一个整数 N(N<=1000),接下来的 N
行包括 N 个学生的数据。每个学生的数据包括姓名(长度不超过 100 的字符串)、
年龄(整形数)、成绩(小于等于 100 的正数)。
输出:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。然后
输出学生信息,按照如下格式:姓名 年龄 成绩
样例输入:
3
abc 20 99
bcd 19 97
bed 20 97
样例输出:
bcd 19 97
bed 20 97
abc 20 99


解答:采用C++sort()函数解决,复杂度为O(nlog2n)

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

/*
定义结构体 
*/
struct E {
	char name[100];
	int age;
	int score;
} buf[1000];

//自定义比较规则
bool cmp(E a,E b) {
	
	//学生分数相同则比较姓名字符的字母序 
	if(a.score == b.score) {
		int temp = strcmp(a.name,b.name);
		
		//如果字母序不相同则姓名字符串字典序小的在前面 
		if(temp =! 0) {
			return temp<0;
		} else 
			
			//如果姓名字典序相同则年龄小的在前面 
			return a.age<b.age;
-

	} else
		return a.score < b.score;
}

int main(){
	
	int n;
	//结构体数组赋值 
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
		}
		
		//时间复杂度O(n*log2n),cmp()函数为自定义排序规则 
		sort(buf,buf+n,cmp);
		printf("\n");
		
		//输出排序结果 
		for(int i=0;i<n;i++){
			printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);			
		}
		
	}
	return 0;
}

 

C++Sort函数有三个参数:排序的数组的起始地址;结束的地址;排序的方法(自定义排序函数);可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。


C语言版:采用qsort()排序函数,复杂度为O(nlog2n),C语言采用的是快排算法;C++sort()采用的是改进后的快排,实际比qsort()快些。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

/*
定义结构体
*/
typedef struct E {
	char name[100];
	int age;
	int score;
}buf;

/*
    a为void *类型,要用(E*)强转成E*类型
	然后用*取值比较大小
*/
int cmp(const void *a,const void *b) {
	//定义结构体指针时,用->访问成员;定义结构体成员的时候就用.访问成员,差点弄错QAQ 
	//转成E型指针,再用A指向buff实参 
	struct E *A = (E*)a;
	struct E *B = (E*)b;
	
	if(A->score == B->score) {
		int temp = strcmp(A->name,B->name);
		if(temp != 0) {
			return temp<0;
		} else 
			//按age从小到大排序 
			return A->age - B->age; 
	} else
	 		//按score从小到大排序 
	    	return A->score - B->score; 
		
}

int main() {

	int n;
	struct E buf[1000];
	//结构体数组赋值
	while(scanf("%d",&n)!=EOF) {
		for(int i=0; i<n; i++) {
			scanf("%s%d%d",&buf[i].name,&buf[i].age,&buf[i].score);
		}

		//时间复杂度O(n*log2n),cmp()函数为自定义排序规则
		qsort(buf,n,sizeof(buf[0]),cmp);
		printf("\n");

		//输出排序结果
		for(int i=0; i<n; i++) {
			printf("%s %d %d\n",buf[i].name,buf[i].age,buf[i].score);
		}
	}
	return 0;
}

C的qsort函数具体用法:qsort()函数用法


刷题,刷题,刷题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值