随笔 - 18  文章 - 0  评论 - 0  阅读 - 23864

sort函数用法简介

排序算法为竞赛中最常用的算法之一,我们可以利用 C++自带的库函数进行排序。
头文件&函数调用格式
使用排序算法必须包含 #include<algorithm> 头文件
自带排序算法的一般形式为:【排序区间,左闭右开,即取左不取右

sort(arr+m,arr+n); //将数组 arr 的下标为 m 的元素到下标为 n-1 的元素进行从小到大排序。
sort(arr+m,arr+n,cmp); //与 sort(arr+m,arr+n)相比,这个写法可以自己定义排序的规则
//其中,cmp 为自定义的函数

如果对数组A下标为[1,12]的范围排序,调用的函数形式应该为:

sort(A+1,A+13);
sort(A+1,A+13,cmp);

从小到大排序
sort函数如果不便用比较函数,默认从小到大排序。
例.从键盘读入 10 个数,然后从小到大输出的功能

#include<iostream>
using namespace std;
int a[10];
int main()
{
for (int i=0;i<10;++i) cin>>a[i];
sort(a+0,a+10);
for (int i=0;i<10;++i)
cout<<endl;
return 0;
}

从大到小排序 从大到小的进行排序。那么我们可以用 sort(arr+n,arr+m,cmp)进行排序。 不过,在调用 sort(arr+n,arr+m,cmp) 之前我们需要自己写个 cmp 函数。

//cmp 函数的名字compare的缩写
bool my_cmp(int x,int y)
{
return x>y; //默认比较函数体内容为:x<y
}

.程序实现从键盘读入 10 个数,然后从大到小输出的功能。

#include<iostream>
using namespace std;
int a[10];
bool cmp(int x,int y){
return x>y; //从大到小排列;默认是 x<y 为真
}
int main()
{
for (int i=0;i<10;++i) cin>>a[i];
sort(a+0,a+10,cmp);
for (int i=0;i<10;++i)
cout<<endl;
return 0;
}

有多个排序规则

在更多情况下,我们不仅对一个特征进行排序,而是多个特征。

例如将学生的成绩进行排序,当然 用上面的做法是行不通的。 这时,我们就想到了结构体这种数据类型。

当我们采用 sort()函数的默认规则排 序结构体时,sort()默认结构体中的第一个成员为第一关键字,第二个成员为第二关键字,……,第 N 个元 素为第 N 关键字,然后从小到大排序。

例.我们要将学生的成绩从大到小排序,当成绩相同时,根据姓名字典序小的优先的规则排进行序。

显然我们无法采用默认规则进行排序。

这时我们可以定义这样的 cmp: 对结构体数组排序,比较函数传参时数据类型应当为结构体类型。

struct STU{
float score;
char name[10];
};
bool StuCmp( STU a, STU b)
{
if (a.score!=b.score) return a.score>b.score; //成绩不相等时,比较成绩
else{//否则(隐含成绩相等)比较姓名字典序
if (strcmp(a.name,b.name)<0) return 1; //strcmp( )函数有三种结果,前面小时直接判断为真,不可以简写
return 0; //包含大于为正时,和相等为0时
}
}

 

posted on   幽遇  阅读(1249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示