sort自定义排序讲解

2023-10-30

问题

算法题当中对原始数据进行排序后,很大概率可以使得解题变得简单。一般情况下都是对 vector 等基本类型进行排序,这时直接使用 sort 函数即可,但是有时候我们想对自定义的结构体等类型进行排序,这时候直接调用sort就行不通了,需要另外定义一个排序规则,然后传给sort函数才行,具体怎么实现呢?

sort内部使用的是什么排序?

sort并不是简单的快速排序,它对普通的快速排序进行了优化,此外,它还结合了插入排序和堆排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择堆排序。

sort的基本使用

要使用该函数需要先包含:#include <algorithm>

sort的函数原型为:sort(first_pointer, first_pointer + n, cmp)

参数1:第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。(左闭)

参数2:第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。(右开)

参数3:默认可以不填,如果不填sort会默认按数组升序排序。也就是1,2,3,4排序。也可以自定义一个排序函数,改排序方式为降序什么的,也就是4,3,2,1这样。

下面给一个sort最常使用的场景:

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	vector<int> nums({13, 5, 3, 7, 43});
	sort(nums.begin(), nums.end());  // 默认升序排序
	for(auto i:nums) {
		cout<<i<<" ";
	}
	cout<<endl;  // 即输出: 3 5 7 13 43
	return 0;
}

想要改为降序排序,简单这样改改就行:

#include <iostream>
#include <algorithm>
using namespace std;

//自定义一个降序排序函数
bool cmp(const int a, const int b) {
	return a > b;  // 前者大于后者返回true,因此为降序排序
}

int main() {
	vector<int> nums({13, 5, 3, 7, 43});
	sort(nums.begin(), nums.end(), cmp);  // cmp函数作为第三个参数传进去即可
	for(auto i:nums) {
		cout<<i<<" ";
	}
	cout<<endl;
	return 0;
}

当然也可以给string排序:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

bool cmp(string a,string b)
{
    return a>b;
}
int main()
{
    string a[4]={"hhhhh","heheheh","xxxxxx","kkkkkk"};
    sort(a,a+4,cmp);
    for(int i=0;i<4;i++)
        cout<<a[i]<<endl;
    return 0;
}

用 sort 对结构体排序

我们可以使用 sort 实现对结构体的自定义条件的排序。

这里摘抄一个博客中的一个例子: 实例化3只dog,并且按照先排公狗,后排母狗的规则排序。排序时先让年龄从大到小排序,如果年龄一样,再考按照体重从轻到重排。

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct Dog{
    int age;
    int weight;
    string sex;
};
bool cmp(struct Dog a,struct Dog b)
{
    if(a.sex==b.sex){
        if(a.age==b.age){
            return a.weight<b.weight;//体重升序
        }
        else return a.age>b.age;//年龄降序
    }
    else return a.sex>b.sex;//性别字典序降序
}
int main()
{
    Dog dog[3];
    dog[0].sex="male";
    dog[0].age=3;
    dog[0].weight=20;

    dog[1].sex="male";
    dog[1].age=3;
    dog[1].weight=15;

    dog[2].sex="male";
    dog[2].age=3;
    dog[2].weight=44;

    sort(dog,dog+3,cmp);
    for(int i=0;i<3;i++){
        cout<<dog[i].sex<<" "<<dog[i].age<<" "<<dog[i].weight<<endl;
    }
    return 0;
}

除了这种在结构体外定义比较函数外,还可以使用在结构体内重载 < 运算符的方法(注意这里重载的只能是 < 运算符,因为 sort 函数内部默认是降序,用的就是 < 运算符)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct student{
    char  name[20];
    int math;
    // 重载 < 运算符
    bool operator < (const student &x){
        return math > x.math ;
    }
}Student;
int main(){
    Student a[4]={{"apple",67},{"limei",90},{"apple",90}};
    sort(a,a+3);  // 在结构体内重载了 < 运算符后,就可以跟vector等类型一样只传入两个参数即可。
    for(int i=0;i<3;i++)    
        cout<<a[i].name <<" "<<a[i].math <<" " <<endl;     
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sort自定义排序讲解 的相关文章

随机推荐

  • 商城APP软件开发要素有哪些

    商城APP软件体系是当今电商行业经常会运用的商城体系 既支撑企业对企业的运营形式 也支撑卖家对消费者的运营形式 便是现在常见的B2C B2B的电商形式APP 跟着现在的互联网的遍及现在这些电商都是成为了电商商家开展的不可缺少的互联网平台 打
  • Golang流程控制-if(十一)

    单分支 if 条件表达式 代码块 说明 当条件表达式为true时 就会执行 内的代码 注意 是必须有的 就算你只写一行代码 双分支 if 条件表达式 代码块1 else 代码块2 说明 当条件表达式成立 执行代码块1 否则执行代码块2 也是
  • 【STM32CubeMX项目】小时钟V1.0

    前言 基于STM32CubeMx STM32F103C6T6编写时钟功能 现在以及能实现时钟的简单功能 做文记录下 还有很多可以改进的地方 也算留下的基础版本下来备份吧 我愿称之为V1 0版本 可供学习参考 实物 引脚接线 OLED STM
  • springboot启动流程

    springboot启动流程 四 application配置文件加载过程 lay 博客园 cnblogs com
  • 完全用 GNU/Linux 工作

    完全用 GNU Linux 工作 摈弃 Windows 低效率的工作方式 发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了 Linux 高效的完成了我所 有的工作 GNU Linux 不是每个人都想
  • 【SQLi-LABS】Less -11 注入思路以及过程

    前言 less 11 是 sqli labs 的第一道 POST 型注入题 因此 我们不能再用之前 GET 型注入的方法 在搜索框进行注入 而是要在输入框里面完成注入 下面的注入流程是基于nliuc师傅的视频教程实现的 下面是他的博客 大家
  • C 语言中int, float, double 和 char 字节大小

    C 语言中int float double 和 char 字节大小 使用 sizeof 操作符计算int float double 和 char四种变量字节大小 sizeof 是 C 语言的一种单目操作符 并不是函数 sizeof 操作符以
  • 百炼智能发布垂直模型“爱迪生”,B2B行业的AIGC大潮来了

    图片来源 Pixels AIGC终于来到B2B行业 企业服务 AGI时代已拉开帷幕 数科星球原创 作者丨苑晶 编辑丨大兔 百炼智能是一家专注B2B行业的智能营销企业 在过去 该行业经历了大数据 人工智能时代的洗礼 随着行业对数据的运用不断纯
  • 内存带宽测试与AVX指令集读写内存

    一 内存理论带宽的计算 内存带宽计算公式 带宽 内存核心频率 内存总线位数 倍增系数 先容我从DDR的技术说起 DDR采用时钟脉冲上升 下降沿各传一次数据 1个时钟信号可以传输2倍于SDRAM的数据 所以又称为双倍速率SDRAM 它的倍增系
  • 知乎3000+赞,同事考上公务员后,抱怨“闲出了鸟”...

    番外篇 故事改编自知乎高赞回答 作者 陈大侠 链接 https www zhihu com question 266783359 answer 316889226 漫画原创公众号 不会笑青年 授权转载请联系微信 laughyouth369
  • Flutter应用开发,系统样式改不了?SystemChrome 状态栏、导航栏、屏幕方向……想改就改

    文章目录 开发场景 SystemChrome 介绍 SystemChrome的使用 导入 SystemChrome 包 隐藏状态栏 说明 改变状态栏的样式 注意事项 其他样式说明 锁定屏幕方向 锁定屏幕方向实例 注意事项 开发场景 开发AP
  • 爬虫学习笔记,从基础到部署。

    爬虫基础知识 笔记中出现的代码已经全部放到了github上https github com liangxs0 python spider save git 1 http基本原理 http 协议 在HTTP之上添加了安全协议的叫https s
  • js筛选对象中的空值

    如果对象中属性比较多 可以循环对象 let data id this equipmentID codeName this equipmentName equipmentInfo this equipmentSite pageSize thi
  • MySQL Index Condition小结

    什么是index Condition 索引下推 index condition pushdown 简称ICP 在Mysql5 6的版本上推出 用于优化查询 在不使用ICP的情况下 在使用非主键索引 又叫普通索引或者二级索引 进行查询时 存储
  • elementui的table复选框单选

  • 无线网卡插上电脑没反应的解决办法

    今天偶然切换WiFi时 网卡突然不能用了 右下角的网络连接标识一直都是显示的无网络 按照百度的方法试了 无非就是装驱动 插电脑后板 也没用 然后我就发现把无线网卡拔了重新插入的时候右下角显示了USB设备的标识 打开 我的电脑 也能发现有后面
  • 把一个表的查询结果当做另一个表的一个字段输出

    把一个表的查询结果当做另一个表的一个字段输出 CourseController java Controller GetMapping getPage number size ApiOperation value 分页查询课程表 含已更新章节
  • GlusterFS(GFS)分布式文件系统

    目录 一 文件系统简介 1 文件系统的组成 2 文件系统的作用 3 文件系统的挂载使用 二 GlusterFS概述 1 GlusterFS是什么 2 GlusterFS的特点 3 GlusterFS术语介绍 3 1 Brick 存储块 3
  • 【C#学习】设置TextBox组件的进度条并将接受到的数据展示在最下方

    设置TextBox组件的进度 将TextBox中的数据默认展示最下方 private void richTextBox2 TextChanged object sender EventArgs e 滚条设置在最下方 this richTex
  • sort自定义排序讲解

    问题 算法题当中对原始数据进行排序后 很大概率可以使得解题变得简单 一般情况下都是对 vector 等基本类型进行排序 这时直接使用 sort 函数即可 但是有时候我们想对自定义的结构体等类型进行排序 这时候直接调用sort就行不通了 需要