sort排序函数入门用法

sort函数

sort是C++的STL中非常常用的排序函数,头文件为<algorithm>

sort(start,end,cmp);

其中startend分别为参与排序的首尾地址,函数将[start,end)范围内的元素进行排序
cmp为比较规则,默认值为从小到大。

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int t[10]={3,4,2,1,8,7,5,6,9,0}; //乱序
    sort(&t[0],&t[10]); //从小到大排序,由于是左闭右开区间,故为地址应该为&t[10]而不是&t[9]
    for(int i=0;i<10;i++)
        cout<<t[i]<<" ";
    return 0;
}

输出

0 1 2 3 4 5 6 7 8 9 

由于数组名直接相当于“首地址”的含义,故一般的传入首地址可以直接写数组名,尾地址可以写数组名+排序长度

sort(t,t+10);

如果我一定要让它从大到小,那就干脆反向输出就需要用到cmp这个参数:

bool cmp(int a,int b){
    return a>b; //从大到小——大于返回true,小于返回false
}
int main()
{
    int t[10]={3,4,2,1,8,7,5,6,9,0};
    sort(t,t+10,cmp);
    for(int i=0;i<10;i++)cout<<t[i]<<" ";
    return 0;
}

输出:

9 8 7 6 5 4 3 2 1 0 

当然,sort的功能远不止此,它更广阔的施展空间在于与类/结构体搭配使用,后文以结构体为例

sort与结构体——cmp的应用

sort函数的灵魂就在于第三个参数:比较规则函数cmp上。

若想实现结构体对象的排序,因为无法直观的判断它的“大小”,所以没法按照默认的从小到大进行排序

比如我现在有两门考试:高数和大物,用结构体存储10个人的分数(都整数),要求按照总分大小排序,总分一样的按照高数成绩从大到小排序:

输入

99 97
100 100
90 90
89 93
88 95
80 100
100 80
90 92
91 91
87 94

输出

100 100
99 97
88 95
91 91 //总分一样按照高数排序,总分182,高数91
90 92 //总分一样按照高数排序,总分182,高数90
89 93 //总分一样按照高数排序,总分182,高数989
87 94
100 80
90 90
80 100

sort与结构体——运算符<重载

由于sort函数的默认排序规则是从小到大,而普通的结构体并没有自带的大小规定。所以我们如果能重载<运算符,为它人为规定一个大小,就可以使用默认的排序规则进行排序

struct student{
    int mat,pht;

}stu[10];

//运算符重载应该还没忘吧
bool operator < (const student& a,const student& b){
    if(a.mat+a.pht==b.mat+b.pht)//如果总分一样,优先比较高数
        return a.mat<b.mat;
    return a.mat+a.pht<b.mat+b.pht;//比较总分
}


int main()
{
    for(int i=0;i<10;i++)
        cin>>stu[i].mat>>stu[i].pht;
    sort(stu,stu+10);
    for(int i=9;i>=0;i--)//倒叙输出,这样就看上去是从大到小了
        cout<<stu[i].mat<<" "<<stu[i].pht<<endl;
    return 0;
}

输入:(同上一题)

99 97
100 100
90 90
89 93
88 95
80 100
100 80
90 92
91 91
87 94

输出:(同上一题)

100 100
99 97
88 95
91 91 //总分一样按照高数排序,总分182,高数91
90 92 //总分一样按照高数排序,总分182,高数90
89 93 //总分一样按照高数排序,总分182,高数989
87 94
100 80
90 90
80 100

案例设计的可以自己输入数据,建议读者按上面的思路自己写一遍,然后自己输入几个数据试一下。

猜你喜欢

转载自blog.csdn.net/pyx2466079565/article/details/107701047