sort()排序
目录
一、原理
sort
是标准库提供的一个非常实用的排序函数,位于 <algorithm>
头文件中。sort()并非只是普通的快速排序
,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法
二、使用方法
(1)引入头文件
#include<algorithm>
algorithm意为算法,是c++的标准模板库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数
(2)语法
1.方式① (默认)
sort(begin, end);
begin
和 end
是迭代器,分别指向待排序区间的起始位置和结束位置的下一个位置。将[first, last) 区间内元素升序(从小到大)排列。【注意区间为左闭右开】
例:
对数组进行排序
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={2,6,5,4,1,2,6,10,2,9};
sort(a,a+10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
对字符串进行排序
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a="fndskjbfirebjk";
sort(a.begin(),a.end());
cout<<a<<endl;
return 0;
}
2.方式②:定义降序
//自定义比较函数
bool compare(int a, int b){
return a > b; // 降序排序
}
sort(begin, end, compare);
第一、二个参数同升序,第三个函数功能为自己定义的比较函数。
比较函数的规则是这样的:
如果返回 true,那么第一个参数会被排在第二个参数之前。
如果返回 false,则第一个参数会被排在第二个参数之后。
a > b 是降序的原因:
当我们写 a > b 作为比较函数时,意味着:
当 a 比 b 大时,返回 true,即 a 应该排在 b 的前面。
因为较大的值会被放在较小值的前面,这就形成了降序排列。
例:
具体例子:
假设我们有一组数字 {1, 3, 2}。
当使用 a > b 作为比较函数时:
比较 1 和 3:1 > 3 为 false,因此 3 应该排在 1 前面。
比较 3 和 2:3 > 2 为 true,因此 3 继续保持在前面。
最终的顺序是:3, 2, 1。对比:
如果我们使用 a < b,则会形成升序排序:
当 a 小于 b 时返回 true,所以较小的值会被放在前面,形成升序排列。
因此,a > b 实现了降序排序,而 a < b 实现了升序排序。
3.对结构体进行排序
先看题
购买贺年卡
描述
新年快到了,笑笑打算给他的好朋友们发贺年卡,而且他已经选好了自己要购买的贺卡的样式。俗话说得好,货比三家,笑笑来到商店,看了各个商铺这种贺卡的价钱。不仅如此,笑笑还记住了每个商铺的存货量。已知笑笑打算购买m张贺卡,问他最少花多少钱。 输入描述 第一行两个整数m和n。其中m表示要购买的贺卡的数量,n 表示商铺的个数。 以下n行,每行两个整数,分别表示该商铺这种贺卡的单价和存货量。 输出描述 仅一个数,表示笑笑花的最少钱数。输入输出样例
输入样例 1
10 4 4 3 6 2 8 10 3 6
输出样例 1
36
这道题的思路是:
根据输入样例来进行分析,想要花费的最少,也就是选择单价最少的来购买,首先需要对价格进行排序,使用升序排列,然后根据需要的数量,进行购买,计算总价。
#include <bits/stdc++.h>
using namespace std;
struct data {
int dj, num;
} a[1000];
bool cmp(data x, data y) {
return x.dj < y.dj; //升序
}
int main() {
int m, n, numa = 0, money = 0;
cin >> m >> n;//m表示要购买的贺卡的数量,n 表示商铺的个数。
for (int i = 0; i < n; i++) {
cin >> a[i].dj >> a[i].num;
}
sort(a, a + n, cmp);//排序根据价格升序
for (int i = 0; i < n; i++) {
numa += a[i].num; //计算数量
money += a[i].dj * a[i].num;//计算总结
if (numa > m) { //如果数量大于需要的数量
money = money - ( (numa - m) * a[i].dj ); //减去多的部分
break;//退出,如果不退出,还会继续加
}
}
cout << money;
return 0;
}
这道题是但条件排序,再来看一道多条件排序的题。
病人排队
题目描述
编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
- 老年人(年龄 ≥60 岁)比非老年人优先看病。
- 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
- 非老年人按登记的先后顺序看病。
输入格式
第 1 行,输入一个小于 100 的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于 10 的字符串表示病人的 ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出格式
按排好的看病顺序输出病人的 ID,每行一个。
输入输出样例
输入 #1
5 021075 40 004003 15 010158 67 021033 75 102012 30输出 #1
021033 010158 021075 004003 102012
这道题的排序条件有三条,分别是
- 老年人(年龄 ≥60 岁)比非老年人优先看病。
- 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
- 非老年人按登记的先后顺序看病。
#include <bits/stdc++.h> using namespace std; struct Patient { string info; int age; int a60; int id; } p[101]; bool cmp(Patient x, Patient y) { if (x.a60 && y.a60) { // 如果x y 都是大于60岁的老人 if (x.age != y.age) { // 如果年龄不同 return x.age > y.age; // 降序 } else if (x.age == y.age) { // 相同 return x.id < y.id; // 根据输入的顺序 } } else if (x.a60 == 1 && y.a60 == 0) { return true; } else if (x.a60 == 0 && y.a60 == 1) { return false; } else { return x.id < y.id; } } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> p[i].info >> p[i].age; p[i].age >= 60 ? p[i].a60 = 1 : p[i].a60 = 0; p[i].id = i; } sort(p, p + n, cmp); for (int i = 0; i < n; i++) { cout << p[i].info << endl; } return 0; }