c++之 sort()排序

sort()排序

目录

sort()排序

一、原理

二、使用方法

(1)引入头文件

(2)语法

1.方式① (默认)

2.方式②:定义降序

3.对结构体进行排序(后续会继续更新)


一、原理

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;
}

这道题是但条件排序,再来看一道多条件排序的题。

病人排队

题目描述

编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

  1. 老年人(年龄 ≥60 岁)比非老年人优先看病。
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
  3. 非老年人按登记的先后顺序看病。

输入格式

第 1 行,输入一个小于 100 的正整数,表示病人的个数;

后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于 10 的字符串表示病人的 ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。

输出格式

按排好的看病顺序输出病人的 ID,每行一个。

输入输出样例

输入 #1

5
021075 40
004003 15
010158 67
021033 75
102012 30

输出 #1

021033
010158
021075
004003
102012

这道题的排序条件有三条,分别是

  1. 老年人(年龄 ≥60 岁)比非老年人优先看病。
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
  3. 非老年人按登记的先后顺序看病。
    #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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超人小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值