C++ sort()函数


sort()函数

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

  要使用sort(),我们需要包含头文件

#include 

  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)如果国籍,年龄都相同,请按照姓名的字典序排序。

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

【输入】

第一行一个整数n0<n1000">n0<n1000n(0

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

【输出】

n">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 
#include 
#include 
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){
        cin>>ath[i].name>>ath[i].age>>ath[i].country;
    }
    //调用sort()函数简化排序过程
    sort(ath,ath+n,cmp);
    //输出,注意序号中0的个数,使用右对齐补0的方式
    for(int i = 0;i){
        //序号
        cout<5)<'0')<1<<" ";
        //信息
        cout<" "<" "<endl;
    }
    return 0;
}