C++ sort()函数

sort()函数是C++STL中的模板函数,用于对容器或数组进行升序排序。它可以接受自定义排序规则,并基于快速排序算法,对小规模数据使用插入排序。文章提供了一个示例,展示如何按照国籍、年龄和姓名的字典序对运动员信息进行排序。
摘要由CSDN通过智能技术生成

sort()函数

  sort()函数是定义在C++ STL 标准库中的一个模板函数 ,它的作业是对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater降序排序规则)。最重要的是我们可以使用函数的形式自定义排序规则,调用时只需要把我们自定义的排序函数作为参数传入即可。
  要使用sort(),我们需要包含头文件。

#include <algorithm>

  sort()本身的实现是基于快速排序,但并不是单纯的快速排序。比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择推排序。具体实现源码看着头疼,就不管了,总之性能还是很好的。

  需要注意的是,sort()函数要求参数容器的迭代器类型为RandomAccessIterator,即随机访问迭代器。这就意味着sort()函数目前只对数组 (array)、向量(vector)、双队列生效(deque)

  另外,若容器内含有多个相同值的元素,使用sort()排序时,可能会导致它们相对位置发生改变。

  sort()函数有三个参数:

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

  参数1:迭代器的起始位置,对于数组来说就是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。

  参数2:迭代器的结束位置,即首地址加上数组的长度n(代表尾地址的下一地址)。

  参数3:排序规则。默认可以不填,如果不填sort会默认按数组升序排序。也就是1,2,3,4。comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater),也可以是STL关联式容器自定义排序规则,还可以直接定义一个具有 2 个参数并返回 bool 类型值的函数作为排序规则。

  对于自定义函数的方法,当函数返回true的时候,关系表达式的左数将会排在数组靠前的位置。例如:

int A[100];
bool cmp1(int a,int b){
    //降序排列
    //return a>b;
    //默认的升序排列
    return a<b;
}
sort(A,A+100,cmp1);

使用例:

能参加大运会,是每个大学生运动员的梦想。大运村男运动员和女运动员是分开入住的,每栋大楼都必须登记运动员的相关信息。登记好后,要按照一定的规则来排序生成编号以便管理。排序的规则是:

1)请按照国籍的字典序排序

2)如果国籍相同,年龄小的排在最前面

3)如果国籍,年龄都相同,请按照姓名的字典序排序。

人工来排,工作非常繁重,于是找到编程高手的你,来帮忙统计处理一下。

【输入】

第一行一个整数n(0<n≤1000)n(0<n≤1000),表示大运村每栋楼入住的人数。

接下来nn行,每行三个数据,分别表示某个运动员的名字(不超过1010个字母,其间不含有空格)、年龄、国籍(三个大写字母),一个空格隔开。

【输出】

nn行,每行四个数据,排序后的编号(五位的字符串,编号不足五位前面补零)以及运动员的信息,均是一个空格隔开。

【输入样例】

5
Tom 21 USA
Jack 21 USA
Klac 22 FRA
Ksd 21 FRA
Takla 22 JPN

【输出样例】

00001 Ksd 21 FRA
00002 Klac 22 FRA
00003 Takla 22 JPN
00004 Jack 21 USA
00005 Tom 21 USA

【题解】


#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
//定义一个运动员类
class athleth {
    public:
        // 姓名
        string name;
        // 年龄
        int age;
        // 国籍
        string country;
};
/**
 * 定义排序规则,函数返回true的时候,关系表达式的左数将会排在数组靠前的位置
 * 参数为两个运动员对象
 * @return
 */
bool cmp(athleth a,athleth b){
    //两个字符串比较大小时,是从左往右逐个比较ASCII码
    if(a.country<b.country){
        return true;
    }
    else if(a.country==b.country&&a.age<b.age){
        return true;
    }
    else if(a.country==b.country&&a.age==b.age&&a.name<b.name){
        return true;
    }else{
        return false;
    }

}

int main( ){
    //获取第一行输入,共有y名选手
    int n;
    cin>>n;
    //运动员数组
    athleth ath[n];
    //循环赋值
    for (int i=0;i<n;i++){
        cin>>ath[i].name>>ath[i].age>>ath[i].country;
    }
    //调用sort()函数简化排序过程
    sort(ath,ath+n,cmp);
    //输出,注意序号中0的个数,使用右对齐补0的方式
    for(int i = 0;i<n;i++){
        //序号
        cout<<setw(5)<<setfill('0')<<right<<i+1<<" ";
        //信息
        cout<<ath[i].name<<" "<<ath[i].age<<" "<<ath[i].country<<endl;
    }
    return 0;
}

原文链接

C++ sort()函数 -QT开发中文网C++ sort()函数 https://qt.0voice.com/?id=859

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值