PAT 第四讲 排序

排序方法

插入排序

特征:从前往后排序,前半段是已经排好的有序,后半段是与原数组同序
每次往后排,都会与前面进行一个交换
在这里插入图片描述

堆排序

每次从堆中取出最大值,并放入后方序列中,后半段是原数组中最大的k个,并且已经排好序
在这里插入图片描述

结构体重载比较符号

// 排序规则	按照 1. total 降序 2. cnt 降序 3. id 升序 进行的排序 
bool operator<(const Student &t) const {
	if (total != t.total) return total > t.total;
	if (cnt != t.cnt) return cnt > t.cnt;
	return id < t.id;
}

自定义比较函数cmp(调用 sort() 时使用)

// id 升序
bool cmp1(Student a, Student b) {
    return a.id < b.id;
}
// 1. name 升序 2. id 升序
bool cmp2(Student a, Student b) {
    if(a.name != b.name)
        return a.name < b.name;
    return a.id < b.id;
}
// 1. grade 升序 2. id 升序
bool cmp3(Student a, Student b) {
    if (a.grade != b.grade)
        return a.grade < b.grade;
    return a.id < b.id;
}

计算排名(可以有并列)

主要说思路和代码实现,并放上两个代码段
思路,首先数组要排好序,然后如果 i != 0 && student[i].total != student[i - 1].total 则排名 +1,否则排名不变

 for (int i = 0, rank = 1; i < res.size(); i++) {
        // 计算排名
        if (i && res[i].total != res[i - 1].total)
            rank = i + 1;
        printf("%d %s\n", rank, res.name.c_str());
 }
// 对第i个地区的同学进行排序
for (int j = 0; j < local[i].size(); j++) {
	if (j == 0 || local[i][j].grade != local[i][j - 1].grade)
		local[i][j].local_rank = j + 1;
	else
		local[i][j].local_rank = local[i][j - 1].local_rank;
	all.push_back(local[i][j]);     // 将第i个地区的所有同学加入总排名中
}

作者:嗯我想想
链接:https://www.acwing.com/activity/content/code/content/2800726/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值