《算法笔记》读书记录DAY_23

本文介绍了C++ STL中的sort函数,用于对序列进行排序,包括基本数据类型的排序、结构体数组的多关键字排序以及STL容器如vector和string的排序。还讲解了如何编写自定义比较函数cmp实现递减排序和复杂排序规则,并强调了sort函数只能用于支持随机访问的容器。

CHAPTER_6  C++STL相关

 

 

 6.9头文件algorithm 

(6)sort()

sort是用来排序的函数,它根据具体情况使用不同的排序算法,进而达到高效。sort()的使用方式如下:

sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(选填));

可以看到,sort的参数有3个,其中前两个必填,它们确定一个左闭右开的区间,而比较函数则按需要填写。如果不写比较函数,则默认按递增排序。

示例如下:

double a[4]={3,2,1,0};
sort(a,a+3);                     //前三个元素按默认递增排序
for(int i=0;i<4;i++){
    cout<<a[i];
}
//输出结果:1230

vector<char> v={'c','a','d','b'};
sort(v.begin(),v.begin()+3);     //以迭代器的方式将前三个字符按字典序排序
for(int i=0;i<4;i++){
    cout<<v[i];
}
//输出结果:acdb

我们需要注意的是,如果要用sort对序列排序,那么序列中的元素一定要有可比性。对于我们自定义的结构体或者类,它们本身并没有可比性,我们就需要人为制定比较的规则,sort的第三个参数就是用来实现自定义的规则。

(7)比较函数cmp

下面讨论对基本数据类型、结构体、STL容器进行自定义规则排序时cmp的写法。

基本数据类型:

对于基本类型,我们如果不填比较函数,那么它们按照默认递增排序。如果我们需要让它们递减排序,需要怎么做呢?

如果要递减排序,我们要编写比较函数cmp,来“告诉”sort何时交换元素。例如:

bool cmp(double a,double b) {
    return a>b;            //可以理解为当a>b时,a放在b前面
}


int main() {
    double a[4]={1.0,2.0,3.0,4.0};
    sort(a,a+4,cmp);
    //sort已经将序列递减排序
    return 0;
}

结构体数组:

在我们自定义的结构体或者类中,有不止一个的成员。如果我们需要对这个结构体数组(类)排序,我们可以制定按多关键字的复杂规则排序。例如:

我们有如下结构体数组:

struct node {

        int x,y;

}n[5];

如果我们想要这个数组按照x的大小递减排序,我们可以按如下编写cmp函数:

bool cmp(node a,node b) {
    return a.x>b.x;
}

如果排序规则更复杂一些,我们需要按x递减排序,如果x相等,则按y的大小递增排序,则cmp函数的编写应该如下:

bool cmp(node a,node b) {
    if(a.x!=b.x)
        return a.x>b.x;
    else
        return a.y<b.y;
}

这里的cmp函数首先判断结构体内的x是否相等,如果不等则x大的放在前面,如果x相等,则y小的放在前面。

容器的排序:

在STL标准容器中,只有vector、string、deque是可以使用sort的。因为只有这三种容器才支持随机访问。像queue、stack、list这样的容器,是严格按照数据结构定义设计的,它们并不支持排序。而set、map这类容器是用红黑树实现的,它们本身有序,故不能使用sort排序。

STL的sort排序方式并没有什么特别的,因为三种容器都支持随机访问,故可以像普通数组那样直接用下标运算当作sort的前两个参数。当然它们还可以使用迭代器来当作sort的参数。例如:

vector<int> v={3,2,1,0};

sort(v,v+4);              //按照下标的方式将一到四个元素排序
sort(v.begin(),v.end());  //按照迭代器的方式排序  

然后我们再来看string的排序。如果省略sort的第三个参数,那么string内部默认按字典序排序。对于string数组的排序也同样如此,例如:

string s[3]={"bbbb","cc","aaa"};
sort(s,s+3);
for(int i=0;i<3;i++){
    cout<<s[i]<<' ';
}
//输出结果:aaa bbbb cc

如果我们想要string按照字符串长度排序,我们可以如下编写cmp函数:

bool cmp(string s1;string s2) {
    return s1.size()<s2.size();    //长度小的放在前面
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值