c++中 sort() 函数用法 及其强大之处

sort (first,last,cmp);  //对[first,last)   之间的进行排序  注意最后一个last是不包括的
cmp是比较函数   是一个自定义的比较规则 对于cmp函数的编写的利用sort函数的关键

下面看应用实例
pat 1028 甲级 题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805468327690240
c++中 sort() 函数用法 及其强大之处_第1张图片
代码如下 注意看代码中的3个cmp函数以及解析 这3个函数都是在结构体中的利用 如果是基本数据类型 直接把typename改一下就好

#include 
#include 
#include 
using namespace std;

struct student {
    int id;
    string name;
    int grade;
}stu[100010];

bool cmp1( student a, student b){  //按id升序在前面
    return a.id<b.id;
}

bool cmp2( student a, student b){  // 按名字升序排序  要是名字一样 按id升序排序  因为name是字符串 会按照字典序来排序
    if(a.name != b.name)  return a.name<b.name;
    else return a.id< b.id;
}

bool cmp3( student a, student b){  // 按成绩升序排序   要是成绩一样 按 id的升序排序
    if(a.grade != b.grade )  return a.grade <b.grade;
    else return a.id< b.id;
}
//综合来看 就是 return中的符号 决定了排序的顺序   return ab,就是大的在前面  就是降序
//         也就是说  return中决定的是在前面的数是什么  是大的 还是小的??                                   

int main()
{
    int n,c,id,grade;
    string name;
    cin>>n>>c;
    for(int i=0;i<n;i++){
        cin>>id>>name>>grade;
        stu[i].id=id;
        stu[i].grade=grade;
        stu[i].name =name;
    }
    if( c ==1){
        sort(stu,stu+n,cmp1);
    }else if( c==2){
        sort(stu,stu+n,cmp2);
    }else if(c==3){
        sort(stu,stu+n,cmp3);
    }
    for(int i=0;i<n;i++){
        printf("%06d %s %d\n",stu[i].id, stu[i].name.c_str(), stu[i].grade);
    }
    system("pause");
    return 0;
}

相信以上的内容 大家以及初步看到了sort函数的强大之处
而且其内部采用的快速排序的方法 时间复杂度是 nlogn级别的 已经是比较快的算法了

其对于字符串方面的排序 更加方便快捷 因为对字符串的排序手动模拟的话 是非常复杂的
然后其强大之处还不仅仅是这些 下面来看这样的一个例子

c++中 sort() 函数用法 及其强大之处_第2张图片
题目的意思是 给一组由数字组成的字符串 叫你找到他们的最小的排列
例如 32 321 3214 0229 87组成的最小排列就是 0229 321 3214 32 87 就是022932132143289
越高位的数字越小越好 那就可以联系到按字典序排序 小的就在前面 可以存在一个问题
注意 321 3214 32 按字典序是 32 321 3214 显然和题目意思不符合 这里要是分开按情况讨论的话 就要先考虑到长度 还有长度不同之后的第一位的大小 等条件 越想越复杂 但是需要实现的是 if(a +b) < (b +a) 那就把符合这个条件的排前面
这对于cmp函数来说 写出来是很简单的
就是

bool cmp(string a ,string b){
    return a+b <b+a;   //string类是可以直接加的  那规则就是   保证按照能够组成的最小数字的形式排列。 (这就是我们自定义的一个规则  sort也能排序)  于是题目迎刃而解
}

完整代码如下

#include 
#include 
#include 
#include 
using namespace std;

bool cmp(string a ,string b){
    return a+b <b+a; 
}

int main()
{
    int n;
    string str[10010];
    cin >>n;
    for(int i=0; i<n; ++i){
        cin>> str[i];
    }
    sort(str,str+n,cmp);
    string s;
    for(int i=0; i<n; ++i){
        s+=str[i];
    }
    while(1){
        if(s[0] == '0'){
            s.erase(s.begin());
        }else{ break;}
    }
    if(s.size() == 0){
        cout<<0;
    }else{
        cout<<s;
    }
    system("pause");
    return 0;
}

你可能感兴趣的:(算法,字符串)