请选择 进入手机版 | 继续访问电脑版

[C 语言] 详解C++ sort函数的cmp参数

[复制链接]
查看167 | 回复31 | 2021-9-12 13:42:29 | 显示全部楼层 |阅读模式
目次

前言 :

学算法的第一天你在学冒泡、桶排

在你还没搞明确 快排和归并的时间

你已经学到了数据布局 末了 的堆排序和希尔排序

可以说排序是很多比赛 生的噩梦……

于是它诞生了

  1. void std::sort()
  2. Sort the elements of a sequence using a predicate for comparison.
  3. 参数:
  4. __first – An iterator.
  5. __last – Another iterator.
  6. __comp – A comparison functor.
复制代码

针对一个地址区间完成排序,算法每次主动 选择,以快排为主

C++必要 头文件

  1. #include <algorithm>
复制代码
(当然万能 头我也没意见)

1、升序排序

最简单的就是用它完成int范例 升序排序

  1. Copy Line-numbers language-cpp
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. int main() {
  6. int a[5] = {2, 1, 3, 5, 4};
  7. sort(a, a + 5);
  8. for (int i = 0; i < 5; i++) cout << a[i] << " ";
  9. }
复制代码

输出如下,很简单

  1. 1 2 3 4 5
复制代码

这里传入给sort的参数

  1. a
复制代码
  1. a + 5
复制代码
都是地址,和大多数编程语言一样,这里遵照 左闭右开原则,即函数现实 会读取和操作的五个地址如下:

  1. a + 0
  2. a + 1
  3. a + 2
  4. a + 3
  5. a + 4
复制代码

2、降序排序

假如 必要 降序排序,程序如下

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. bool cmp(int x, int y){
  5. return x > y;
  6. }
  7. int main() {
  8. int a[5] = {2, 1, 3, 5, 4};
  9. sort(a, a + 5, cmp);
  10. for (int i = 0; i < 5; i++) cout << a[i] << " ";
  11. }
复制代码

输出:

  1. 5 4 3 2 1
复制代码

我们多写了一个bool范例 的cmp函数,并将其地址作为第3个参数传给了sort

cmp可以更换 其内置的函数来判定 毕竟 该让哪些元素在前哪些元素在后

很多小伙伴大概 有个疑惑 :怎样 从实质上明确 cmp函数,或者说我毕竟 该怎么记住cmp怎么写呢?

我们来看这三个点:

  • 毋庸置疑,cmp函数返回bool范例 ,表示当前排序是否精确 (详细 见3)
  • cmp函数应担当 两个参数,范例 与要排序的数组雷同 (可以是int、short和long long这些常见范例 ,当然也可以是布局 体)
    1. cmp返回值的实际意义是传入a、b两个参数,a在前b在后的排序是否是正确的,若是正确的返回1(true),否则返回0(false)<br />
    复制代码

那么我们再看一个布局 体的排序实例

3、布局 体的排序实例

布局 体的排序实例:输入10个门生 的名字和成绩,按照成绩从高到低排序后输出

输入数据:

  1. Yixiangzhilv 90
  2. Mydr 60
  3. Xiaoming 10
  4. Mr.Glass 60
  5. GZN 80
  6. Wangzi 85
  7. Hyx 100
  8. Wyx 99
  9. Xth 0
  10. Zz 75
复制代码

程序实现如下:

  1. #include <algorithm>
  2. #include <iostream>
  3. using namespace std;
  4. struct node {
  5. string name;
  6. int score;
  7. };
  8. bool cmp(struct node x, struct node y) {
  9. return x.score > y.score;
  10. }
  11. int main() {
  12. struct node a[10];
  13. for (int i = 0; i < 10; i++) cin >> a[i].name >> a[i].score;
  14. sort(a, a + 10, cmp);
  15. for (int i = 0; i < 10; i++) cout << a[i].name << " " << a[i].score << endl;
  16. }
复制代码

(此处还有一个C++知识:假如 已经定义布局 体node,那么 struct node a[10]; 和 node a[10]; 都是合法的)

以上就是详解C++ sort函数的cmp参数的详细 内容,更多关于C++ sort函数的cmp参数的资料请关注脚本之家别的 相干 文章,盼望 大家以后多多支持脚本之家


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 不忘初心xrl | 2021-9-19 06:12:56 | 显示全部楼层
怪事年年有,今年特别多!
回复

使用道具 举报

avatar 素身素 | 2021-9-19 06:13:00 | 显示全部楼层
我对admin楼主的敬仰犹如滔滔江水绵延不绝!
回复

使用道具 举报

avatar 核桃脆 | 2021-9-22 04:55:54 | 显示全部楼层
这么版块的帖子越来越有深度了!
回复

使用道具 举报

avatar 清风JA1 | 2021-9-22 12:38:10 | 显示全部楼层
祖国尚未统一,我却天天灌水,好内疚!
回复

使用道具 举报

avatar 123457245 | 2021-9-23 20:25:21 | 显示全部楼层
回帖也有有水平的!
回复

使用道具 举报

avatar 无人岛屿颈 | 2021-9-27 03:07:18 | 显示全部楼层
admin楼主主机很热情啊!
回复

使用道具 举报

avatar Abby_guguk | 2021-9-27 17:20:02 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

avatar 们至熟两创 | 2021-9-28 00:02:28 | 显示全部楼层
无图无真相!
回复

使用道具 举报

avatar 123457736 | 2021-9-30 00:44:48 | 显示全部楼层
有品位!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则