排序类算法

2023-11-09

利用vector进行排序

数字类元素

  每个元素一般包含多个条件,利用lambda编写特定排序条件,用sort完成排序。
涉及的知识点:

  • sort函数以及排序规则
    • 默认是std::less<type>, 即较小的元素在前;std::greater<type>,较大元素先序;
    • 也可以编写自定义排序函数,包括lambda、函数对象、普通函数等。自定义排序规则时,需要明确排序规则,两个元素比较,返回true时,较小元素在前,返回false时,较大元素在前。可以将多个条件进行判断,进行复合排序;
  • lambda函数
struct Info
{
    int age;
    int money;
    int health;
};

void ShowInfo(const Info& info)
{
    cout << info.age << " " << info.health << " " << info.money << endl;;
}

void ShowVec(const vector<Info>& vt)
{
    for (const auto& elem : vt) {
        ShowInfo(elem);
    }
    cout << endl;
}

int main()
{   
    vector<Info> dataVec{
        { 32, 7, 70 },
        { 18, 0, 100 },
        { 23, 8, 90 },
        { 28, 4, 85 },
        { 23, 2, 99 },
        { 37, 8, 65 },
    };

    /* 正能量排序 */
    auto cmp = [](const Info& a, const Info& b){
        if (a.age != b.age) {
            return a.age < b.age;
        } else if (a.health != b.health) {
            return a.health > b.health;
        } else {
            a.money > b.money;
        }

        return true;
    };

    ShowVec(dataVec);

    sort(dataVec.begin(), dataVec.end(), cmp);
    cout << "*************" << endl;
    ShowVec(dataVec);

    return 0;
}

字符串类元素

  字符串排序中多涉及字典序排序。**字典序:**字符串左端对齐,然后逐个字符对比,字符ascii大小相同时,再比较后面的字符;如果前面都相同,但是长度不同,长度小的先序;SLT容器中对string的默认排序都是按照字典序排序的
涉及的知识点:

  • 什么是字典序以及自定义字符串排序规则。STL中容器针对string默认都是按照字典序排序的,包括map、set、priority_queue。
struct Info
{
    string name;
    int age;
    int money;
    int health;
};

void ShowInfo(const Info& info)
{
    cout << info.name << " "<< info.age << " " << info.health << " " << info.money << endl;;
}

void ShowVec(const vector<Info>& vt)
{
    for (const auto& elem : vt) {
        ShowInfo(elem);
    }
    cout << endl;
}

int main()
{   
    vector<Info> dataVec{
        { "abc123", 32, 7, 70 },
        { "bbc123", 18, 0, 100 },
        { "ccc123", 23, 8, 90 },
        { "abc", 28, 4, 85 },
        { "melon", 23, 2, 99 },
        { "jiaojiao", 37, 8, 65 },
    };

    /* 正能量排序 */
    auto cmp1 = [](const Info& a, const Info& b){
        if (a.age != b.age) {
            return a.age < b.age;
        } else if (a.health != b.health) {
            return a.health > b.health;
        } else {
            a.money > b.money;
        }

        return true;
    };

    /* 按照名字字典序排序 */
    auto cmpName = [](const Info& a, const Info& b){
        return a.name < b.name;
    };

    /* 自定义字符串排序规则 */
    auto cmpName2 = [](const Info& a, const Info& b){
        if (a.name.length() != b.name.length()) {
            return a.name.length() < b.name.length();
        } else {
            return a.name < b.name;
        }
    };  

    ShowVec(dataVec);

    sort(dataVec.begin(), dataVec.end(), cmpName2);
    cout << "*************" << endl;
    ShowVec(dataVec);

    return 0;
}

利用其他STL容器排序

map

  其中元素是pair类型,默认先对key排序,key相同后再对value排序。如果可以直接利用map的排序,那就直接用map,但是如果需要重写排序规则,那还是推荐使用vector多维数组,然后编写对应排序规则,这样代码更清晰。如果只是利用map的哈希映射,那推荐使用unorded_map,没有默认排序,也有自动去重功能,效率能高些。

set

  针对单个元素,默认排序,且有自动去重功能。

priority_queue

  找出其中的k个最大元素,greater<>;找出其中k个最小元素,less<>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序类算法 的相关文章

  • C/C++排序

    目录 C排序 头文件 使用 C 排序 头文件 使用 1 自定义类型 2 自定义类型 C排序 C语言中排序函数为qsort 原理为快速排序 头文件 在使用前 要添加头文件如下 include
  • 二分查找4 - 搜索旋转排序数组

    搜索旋转数组 1 题目 整数数组 nums 按升序排列 数组中的值 互不相同 在传递给函数之前 nums 在预先未知的某个下标 k 0 lt k lt nums length 上进行了 旋转 使数组变为 nums k nums k 1 nu
  • 多益网络2022春笔试题记忆版

    多益网络笔试题 自己做完之后凭记忆整理出来的 填空题 数据结构 数据库 相对没那么难 所以只记了几个 选择题 1 A B C栈的出栈序列可能性有几种 2 关于队列 3 插入数据库表 name char 20 not null age cha
  • (SUB)选择排序时间、空间复杂度

    基本思想 将一组数据分为两部分 前面是已排序部分 后面是未排序部分 初始状态可认为位置 0 为已排序部分 数组下标从0开始 其余为未排序部分 每一次都从未排序部分选择一个最小元素放在已排序部分的末尾 然后已排序部分增加一个元素 未排序部分减
  • Java排序算法:选择排序

    Java排序算法 选择排序 选择排序它的主要思想是 在未排序的数组中选择最小的元素 然后将其放置在数组的起始位置 再在剩余的未排序数组中选择最小元素 并将其放置在已排序部分的末尾 重复此过程 直到整个数组排序完成 选择排序的步骤如下 1 从
  • 算法学习01-选择、冒泡、插入排序

    1 选择排序 选择排序 0到n 1位置 找到最小值 放到0位置 1到n 1位置 找到最小值 放到1位置 i到n 1位置 找到最小值 放到i位置 以此类推 public class SelectionSort public static vo
  • 【数据结构与算法】--排序

    目录 一 排序的概念及其运用 二 常见的排序算法 2 2选择排序 2 3 交换排序 2 3 4 1 快速排序优化 一 排序的概念及其运用 1 1 排序的概念 排序 所谓排序 就是使一串记录 按照其中的某个或某些关键字的大小 递增或递减的排列
  • 大数据量的冒泡排序 (计次数)

    题目描述 给定一个包含从0到n 1各一次的数组 若使用冒泡排序将其排为升序 问其中需要进行多少次交换 输入 测试数据有多组 每组由两行组成 第一行包含正整数n n lt 5000 下一行包含从0到n 1的n个整数的序列 输出 对于每组测试数
  • 非递归算法——快速排序、归并排序

    哈喽大家好 我是保护小周 本期为大家带来的是常见排序算法中的快速排序 归并排序 非递归算法 分享所有源代码 粘贴即可运行 保姆级讲述 包您一看就会 快来试试吧 目录 一 递归的缺陷 1 1 栈是什么 数据结构 栈 又是什么 他们之间有什么区
  • 九种常见排序的比较和实现

    首先排序算法大的可以分为 关键字比较 非关键字比较 关键字比较 关键字比较就是通过关键字之间的比较和移动 从而使整个序列有序 而关键字比较的算法 又可以像下面这样划分 对于排序算法之间的比较 无异于时间复杂度和空间复杂度 看下面这张表格 由
  • GIF演示排序算法

    最近在准备笔试 面试 看了不少关于排序算法的知识 总感觉代码有余 直观不足 所以想利用直观的GIF动图来演示各种排序算法 1 插入排序 Insertion Sort 1 1算法简介 插入排序 Insertion Sort 的算法描述是一种简
  • 算法相关-经典排序算法(goland实现)

    概述 插入排序 将未排序的元素同已排序的元素从后往前比较 带排序元素 a 被比较元素 b 如果a
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • 堆排序的topk问题+归并排序+六大排序总结

    回忆一下堆排序 思路 sift函数 调整 将父亲和孩子 左孩子和右孩子中最大的那个数 然后和父亲比较 如果孩子大就将孩子的位子变为下一个父亲 往下拉 并且将孩子的值赋给他的父亲 j lt high 条件认可 防止父亲在最后一层 魔法般的对应
  • LeetCode -- 1833. 雪糕的最大数量

    使用的算法 计数排序 贪心算法 计数排序 1 基于比较的排序算法 2 在对一定范围内的整数排序时 它的复杂度为 n k 其中k是整数的范围 快于任何比较排序算法 当O k gt O nlog n 的时候其效率反而不如基于比较的排序 基于比较
  • 2023华为OD机试真题【双指针/优雅子数组】

    题目内容 如果一个数组中出现次数最多的元素出现大于等于K次 被称为K 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组1 2 3 1 2就不是一个3 优雅数组
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 详解十大经典排序算法(四):希尔排序(Shell Sort)

    算法原理 希尔排序是一种基于插入排序的排序算法 也被称为缩小增量排序 它通过将待排序的序列分割成若干个子序列 对每个子序列进行插入排序 然后逐步缩小增量 最终使整个序列有序 算法描述 希尔排序 Shell Sort 是一种基于插入排序的算法
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 数据结构——排序

    前言 哈喽小伙伴们好久不见 也是顺利的考完试迎来了寒假 众所周知 不怕同学是学霸 就怕学霸放寒假 假期身为弯道超车的最佳时间 我们定然是不能懒散的度过 今天我们就一起来学习数据结构初阶的终章 七大排序 本文所有的排序演示都为升序排序 目录

随机推荐

  • 【LeetCode】345. 反转字符串中的元音字母

    题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 示例 1 输入 s hello 输出 holle 示例 2 输入 s leetcode 输出 leotc
  • odoo连接器-odoo数据拉取,Java xml-rpc实现

    背景 odoo数据拉取 创建 更新 参考 官方external api文档 External API Odoo 14 0 文档 术语 ORM odoo数据以对象模型呈现 支持one2many many2one many2many等对象关联关
  • FSDataOutputStream 的深入分析

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 在这里插入代码片 Hadoop对于写操作提供了一个类 F
  • 刷脸支付服务商重金之下必有勇夫

    为了吸引消费者使用刷脸支付 而非扫码 支付宝和微信会给消费者提供优惠 比如在店里面使用刷脸会有随机立减 打折活动 而扫码则没有 这只是给消费者的补贴 以利益吸引商家与推广人员加入刷脸支付同样重要 显然 与二维码支付的几乎没有成本不同 刷脸支
  • C++全局变量的声明和定义

    参考 http wrchen blog sohu com 71617539 html 1 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 第一步 将每个 cpp c 和相应的 h文件编译成ob
  • 算法学习:插值型求积公式

    算法学习 插值型求积公式 牛顿 柯斯特 Newton Cotes 求积公式 定义 牛顿 柯斯特 Newton Cotes 求积公式是插值型求积公式的特殊形式 在插值求积公式 baf x dx baP x dx k 0nAkf xk a b
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • Armbian5.9.0如何安装docker及部署可视化portainer

    安装 docker 通过 ssh 进去 Armbian 系统后 输入下面代码 按提示输入y 等待安装完成即可 apt install docker io 如何查看 docker 是否安装成果 输入命令 docker 可出现docker帮助内
  • MySQL常用命令用法总结

    原文 http www jb51 net article 22110 htm 一 启动与退出 1 进入MySQL 启动MySQL Command Line Client MySQL的DOS界面 直接输入安装时的密码即可 此时的提示符是 my
  • Win 10系统无法连接蓝牙耳机问题

    问题描述 本人刚入手的笔记本电脑 设置里面也有 蓝牙 的开关 由于处于实验室的环境不能开外放 有线耳机显得很不舒服 于是本人兴奋地拿起平时用的蓝牙耳机 想和电脑连起来 但是打开蓝牙开关之后 遇到了下面的情况 打开添加完设备之后 不仅仅是本人
  • springboot2.0学习笔记 自定义JSON序列化程序和反序列化器

    如果使用jackson序列化和反序列化json数据 则可能需要编写 自己JsonSerializer和JsonDeserializer的类 Spring提供了一个替代方案 JsonComponent创建注释 直接注册spring bean容
  • SecureCRT 64位 破解版v8.1.4

    http www xue51 com soft 1510 html xzdz securecrt 破解版是一款支持SSH1和SSH2的终端仿真程序 这个程序能够在windows系统中登陆UNIX或Linux的服务器主机并且还能进行管理设置
  • 全网最细的SpringBoot3系列教程

    1 开发第个Spring Boot应用 创建POM 因为是3 0 0 M1版本 是程碑版本 不是正式发布版 需要从Spring提的Maven仓库中才能下载到3 0 0 M1版本的依赖包 需要在pom xml件中单独指定仓库地址 如果使的是正
  • 安卓真机调试安装失败Session ‘app‘: Installation did not succeed. The application could not be installed: IN:

    Session app Installation did not succeed The application could not be installed INSTALL FAILED TEST ONLY 解决方案 在gradle pr
  • 自定义Looper/Handler模型 线程wait/notify版本 非poll版本

    循环 public static class Looper final static ThreadLocal
  • PS证件照换底色

    原图 1 本教程采用photoshop CS5制作 其它版本基本通用 先在PS中打开原图 如下图所示 2 右键单击背景图层 在弹出的菜单中选择 复制图层 如下图所示 3 接着会弹出 复制图层 对话框 直接按确定即可 如下图所示 4 单击选中
  • pymysql的使用

    pymysql是从Python连接到MySQL数据库服务器的接口 其官方文档为 https pymysql readthedocs io en latest 安装 pip install pymysql 对于数据库的操作 我们一般是这样的操
  • 正在开发应用于Maxthon、TT等多页面浏览器的页面模式

    经过大量的用户调查 我们发现 有不少朋友使用了Maxthon 腾讯TT 世界之窗等基于IE的多页面浏览器使用WEBCHAT 而这种模式下弹出窗口将变成一个新页面 用起来不方便
  • 如何查看支付宝旗下的天弘基金一共有多少只?分别是什么?

    如何查看支付宝旗下的天弘基金一共有多少只 分别是什么 2020年 股市风格突变 相对股市个股的跌宕起伏 基金的收益可谓一枝独秀 下面我们将对基金进行研究 看看我们可以获取数据能否到什么程度 利用tushare的数据接口就可以获取基金的名称
  • 排序类算法

    文章目录 利用vector进行排序 数字类元素 字符串类元素 利用其他STL容器排序 map set priority queue 利用vector进行排序 数字类元素 每个元素一般包含多个条件 利用lambda编写特定排序条件 用sort