PTA乙级--成绩排名

文章详细介绍了如何在C++中使用vector动态数组以及自定义排序函数对结构体(如学生数据)的成绩进行排序,同时展示了快速排序算法的应用。
摘要由CSDN通过智能技术生成
#include<iostream>
#include <string>
#include<algorithm>
using namespace std;
//方法一:用vector动态数组对结构体进行排序
//#include<bits/stdc++.h>//这是万能头文件
#include<vector>//用vector要用这个头文件
//构造学生结构体
//定义结构体struct 加 节点名 加分号
struct student {
	string name;//姓名
	string xuehao;//学号
	int score;//成绩
};
vector<student>a;//STL容器创建方法 vector<数据类型> 变量名
//创建了一个vector,是一个动态数组 名为a,其中的元素类型是student类型
//因为要对成绩排序,所以用自定义排序函数
//cmp函数返回类型是bool,有两个形参,
//两个形参是vector数组的类型,返回值是比较大小的结果
//注意:cmp函数,返回值只能是大于或小于,不能有大于等于,小于等于
//一般用sort函数对动态数组排序
//vector.begin()代表vector首元素,返回第一个元素的迭代器
// 
//vector.end()代表最后一个元素,返回最后一个元素的迭代器
/*Sort函数使用模板:
* Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

Sort(start,end,排序方法)*/
bool cmp(student p, student q) {
	return p.score > q.score;
}//student类型的p对象,q对象,比较二者的成绩,如果p的成绩高于q返回真,否则为假

int main() {
	int n;
	cin >> n;//n个学生
	for (int i = 1; i <= n; i++) {
		student m;//用来存储输入的student类型数据

		cin >> m.name >> m.xuehao >> m.score;
		a.push_back(m);//动态数组的插入操作 vector名.push_back(变量)

	}
	sort(a.begin(), a.end(), cmp);//对动态数组中的成绩进行由大到小排序
	cout << a[0].name << " " << a[0].xuehao << endl;
	cout << a[n - 1].name << " " << a[n - 1].xuehao << endl;
	return 0;
}

方法二:使用快速排序

struct student {
	string name;
	string xuehao;
	int score;
};
//使用快速排序来对成绩排序
/*快速排序的思想:
* 选取待排序元素k作为基准元素,将数组划分为小于或等于k,大于k两部分子数组
* 分别对两个子数组重复上述过程,直到所有元素排好
*/
//先进行partition,每次分划确定一个元素的位置
/*
* 用两个指针L(less,喜欢比k小的元素,从左往右扫描,所以遇到比k小的就继续扫描,把比k小的留到左侧)
* 和G(greater,喜欢比k大的元素,从右往左扫描,遇到比k大就继续扫描,遇到比k小就把他换到另一边)
*/
int partition(vector<student>a, int m, int n) {//对子数组 am--an划分
	student K = a[m];//a[m]为基准元素
	int L = m + 1;//L从m的下一个位置开始
	int G = n;
	while (L <= G) {
		while (L <= n && a[L].score<= K.score) {//如果L不越界而且满足成绩比k小
			L++;//就继续向右扫描
		}
		while (a[G].score > K.score) {
			G--;
		}
		if (L < G) {//也就是L和G未相遇 ,想换
			swap(a[L], a[G]);
		}
	}
	swap(a[m], a[G]);
	return G;
}
void quicksort(vector<student>a, int m, int n) {
	if (m < n) {
		int j = partition(a, m, n);
		quicksort(a, m, j - 1);
		quicksort(a, j + 1, n);
	}
}
int main() {
	int n;
	cin >> n;
	vector<student>a(1);//名为a,其中包含元素为student类型的vector动态数组
	a.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i].name >> a[i].xuehao >> a[i].score;
	}
	quicksort(a,0,n-1);
	cout << a[n - 1].name << " "<<a[n - 1].xuehao<<endl;
	cout << a[0].name << " "<<a[0].xuehao<<endl;
	return 0;
}struct student {
	string name;
	string xuehao;
	int score;
};
//使用快速排序来对成绩排序
/*快速排序的思想:
* 选取待排序元素k作为基准元素,将数组划分为小于或等于k,大于k两部分子数组
* 分别对两个子数组重复上述过程,直到所有元素排好
*/
//先进行partition,每次分划确定一个元素的位置
/*
* 用两个指针L(less,喜欢比k小的元素,从左往右扫描,所以遇到比k小的就继续扫描,把比k小的留到左侧)
* 和G(greater,喜欢比k大的元素,从右往左扫描,遇到比k大就继续扫描,遇到比k小就把他换到另一边)
*/
int partition(vector<student>a, int m, int n) {//对子数组 am--an划分
	student K = a[m];//a[m]为基准元素
	int L = m + 1;//L从m的下一个位置开始
	int G = n;
	while (L <= G) {
		while (L <= n && a[L].score<= K.score) {//如果L不越界而且满足成绩比k小
			L++;//就继续向右扫描
		}
		while (a[G].score > K.score) {
			G--;
		}
		if (L < G) {//也就是L和G未相遇 ,想换
			swap(a[L], a[G]);
		}
	}
	swap(a[m], a[G]);
	return G;
}
void quicksort(vector<student>a, int m, int n) {
	if (m < n) {
		int j = partition(a, m, n);
		quicksort(a, m, j - 1);
		quicksort(a, j + 1, n);
	}
}
int main() {
	int n;
	cin >> n;
	vector<student>a(1);//名为a,其中包含元素为student类型的vector动态数组
	a.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i].name >> a[i].xuehao >> a[i].score;
	}
	quicksort(a,0,n-1);
	cout << a[n - 1].name << " "<<a[n - 1].xuehao<<endl;
	cout << a[0].name << " "<<a[0].xuehao<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值