PAT 1028. List Sorting (25) 重写sort 函数中的cmp

本文介绍了一个模拟Excel排序功能的算法实现,可以根据不同列对学生记录进行排序,包括ID、姓名及成绩,并提供了具体的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Excel can sort records according to any column. Now you are supposed to imitate this function.

Input

Each input file contains one test case. For each case, the first line contains two integers N (<=100000) and C, where N is the number of records and C is the column that you are supposed to sort the records with. Then N lines follow, each contains a record of a student. A student's record consists of his or her distinct ID (a 6-digit number), name (a string with no more than 8 characters without space), and grade (an integer between 0 and 100, inclusive).

Output

For each test case, output the sorting result in N lines. That is, if C = 1 then the records must be sorted in increasing order according to ID's; if C = 2 then the records must be sorted in non-decreasing order according to names; and if C = 3 then the records must be sorted in non-decreasing order according to grades. If there are several students who have the same name or grade, they must be sorted according to their ID's in increasing order.

Sample Input 1
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
Sample Output 1
000001 Zoe 60
000007 James 85
000010 Amy 90
Sample Input 2
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
Sample Output 2
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Sample Input 3
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
Sample Output 3
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90


此题要注意两点:一是结构体数组要设置为全局变量,否则会overflow;另一点就是sort()中cmp函数的重写方法。

具体实现代码如下:

 

#include<cstdio>
#include<algorithm>
#include<string>

using namespace std;

typedef struct info{
	char id[7];
	char name[9];
	int grade;
}info;

bool compare1(const info &a,const info &b){
	for(int i = 0;i<6;i++){
		if(a.id[i] != b.id[i])
			return a.id[i] < b.id[i];
	}
}
bool compare2(const info &a,const info &b){
	for(int i = 0;i < 9;i++){
		if(a.name[i] != b.name[i])
			return a.name[i] < b.name[i];
	}
	for(int i = 0;i<6;i++){
		if(a.id[i] != b.id[i])
			return a.id[i] < b.id[i];
	}
}
bool compare3(const info &a,const info &b){
	if(a.grade != b.grade)
		return a.grade < b.grade;
	for(int i = 0;i<6;i++){
		if(a.id[i] != b.id[i])
			return a.id[i] < b.id[i];
	}
}

info ss[100000];

int main(void){
	int N,C;
	scanf("%d %d",&N,&C);
	for(int i = 0;i < N;i++)
		scanf("%s %s %d",ss[i].id,ss[i].name,&ss[i].grade);
	if(C==1)
		sort(ss,ss + N,compare1);
	else if(C==2)
		sort(ss,ss + N,compare2);
	else
		sort(ss,ss + N,compare3);
	for(int i = 0;i < N;i++)
		printf("%s %s %d\n",ss[i].id,ss[i].name,ss[i].grade);

	return 0;
}


 

### C++ STL `list` 容器中 `sort()` 成员函数的使用 在C++标准模板库(STL)中,`std::list` 提供了一个名为 `sort()` 的成员函数来对列表中的元素进行排序。此函数仅能用于已定义小于操作符 (`<`) 的元素类型。 #### 基本语法 对于不带参数调用的情况,默认按照升序排列: ```cpp void list<T>::sort(); ``` 如果希望自定义比较方式,则可以传递一个二元谓词作为参数: ```cpp template <class Compare> void list<T>::sort(Compare comp); ``` 这里 `comp` 应该接受两个同类型的对象并返回布尔值表示前者是否应排在后者之前。 #### 示例代码展示如何使用 `list::sort()` 下面的例子展示了创建一个整数列表,并对其进行简单排序以及通过提供定制化规则来进行降序排序的方法。 ```cpp #include <iostream> #include <list> using namespace std; // 自定义比较函数实现降序排序 bool desc_compare(int a, int b){ return a > b; } int main(){ // 初始化包含一些无序整数的列表 list<int> myList = {4, 2, 9, 6, 5}; cout << "Before sorting:" << endl; for(auto elem : myList) cout << elem << ' '; // 调用默认升序排序 myList.sort(); cout << "\nAfter ascending sort:" << endl; for(auto elem : myList) cout << elem << ' '; // 使用lambda表达式或预定义函数指针做降序排序 myList.sort(desc_compare); cout << "\nAfter descending sort with custom comparator:" << endl; for(auto elem : myList) cout << elem << ' '; return 0; } ``` 上述程序先打印原始未排序的数据序列,接着执行一次普通的升序排序再输出结果;最后利用用户指定的比较逻辑完成降序重排[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值