Python及C++中的排序

news2025/4/15 4:51:36

一、Python中的排序

(一)内置排序函数sorted()

  1. 基本用法
    • sorted()函数可以对所有可迭代对象进行排序操作,返回一个新的列表,原列表不会被修改。
    • 例如,对于一个简单的数字列表nums = [3, 1, 4, 1, 5, 9, 2, 6],使用sorted(nums)后会得到[1, 1, 2, 3, 4, 5, 6, 9]
    • 对于字符串列表,如words = ["apple", "banana", "cherry", "date"]sorted(words)会按照字母顺序排序,得到['apple', 'banana', 'cherry', 'date']
  2. 关键字参数
    • key参数
      • 可以通过key参数指定一个函数,该函数会在排序时被调用,用于提取比较的键。
      • 比如,如果有一个包含数字和字母的列表mixed_list = ['a', 'c', 'b', 1, 3, 2],我们想要按照字符的ASCII值进行排序,可以使用sorted(mixed_list, key=str)。因为str函数会将数字转换为字符串,然后按照字符串的ASCII值排序,结果是[1, 2, 3, 'a', 'b', 'c']
      • 对于更复杂的数据结构,如一个包含学生信息的列表students = [{'name': 'Alice', 'age': 23}, {'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}],如果按照年龄排序,可以使用sorted(students, key=lambda x: x['age']),得到[{'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}, {'name': 'Alice', 'age': 23}]
    • reverse参数
      • 用于指定排序顺序,默认为False,表示升序排序。如果设置为True,则为降序排序。
      • 例如,sorted(nums, reverse=True)会将数字列表nums降序排序为[9, 6, 5, 4, 3, 2, 1, 1]

(二)列表的sort()方法

  1. 基本用法
    • sort()方法是列表对象的一个方法,它会直接对原列表进行排序,不返回新的列表。
    • 对于列表nums = [3, 1, 4, 1, 5, 9, 2, 6],调用nums.sort()后,nums就变成了[1, 1, 2, 3, 4, 5, 6, 9]
  2. 关键字参数
    • 它也支持keyreverse参数,用法和sorted()函数类似。例如,nums.sort(key=lambda x: -x)会按照数字的相反数进行排序,即降序排序。

二、C++中的排序

(一)标准库函数sort()

  1. 头文件
    • 在C++中,要使用sort()函数,需要包含头文件<algorithm>
  2. 基本用法
    • sort()函数的原型是void sort(RandomAccessIterator first, RandomAccessIterator last),其中firstlast分别是迭代器,表示要排序的范围。
    • 例如,对于一个数组int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};,可以使用sort(arr, arr + 8);来对整个数组进行升序排序。
    • 对于std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};,可以使用sort(vec.begin(), vec.end());来对vector容器中的元素进行排序。
  3. 自定义比较函数
    • 可以通过提供第三个参数来自定义排序规则。这个参数是一个比较函数,它接收两个参数,返回一个布尔值。
    • 比如,要对一个结构体数组按照某个成员进行排序,假设有一个结构体struct Person { std::string name; int age; };和一个数组Person people[] = {{"Alice", 23}, {"Bob", 20}, {"Charlie", 22}};,如果按照年龄升序排序,可以这样写:
      bool compareAge(const Person &a, const Person &b) {
          return a.age < b.age;
      }
      sort(people, people + 3, compareAge);
      
    • 也可以使用C++11的lambda表达式来简化比较函数的定义,例如sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });可以对vector中的整数进行降序排序。

(二)stable_sort()

  1. 稳定性
    • stable_sort()sort()类似,但它是一个稳定排序算法。稳定排序算法是指当两个元素相等时,它们在排序后的序列中的相对位置保持不变。
    • 例如,对于一个包含重复元素的数组int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};,使用sort(arr, arr + 8);stable_sort(arr, arr + 8);都会得到[1, 1, 2, 3, 4, 5, 6, 9]。但如果数组中有对象,且对象的比较键相同,但其他属性不同,stable_sort()会保持这些对象的原始相对顺序。
  2. 用法
    • 它的用法和sort()类似,也可以接受自定义比较函数。例如,对于一个std::vector<Person>,如果按照名字的字典序进行稳定排序,可以这样写:
      stable_sort(vec.begin(), vec.end(), [](const Person &a, const Person &b) {
          return a.name < b.name;
      });
      

三、Python和C++排序的性能比较

  1. Python排序
    • Python的sorted()sort()方法底层实现是Timsort算法,它是一种混合排序算法,结合了归并排序和插入排序的优点。对于大多数情况,其时间复杂度为O(nlogn),在实际应用中表现很高效。
  2. C++排序
    • C++的sort()函数通常实现为快速排序、归并排序或堆排序的混合体,具体实现可能因标准库的实现而异。它的平均时间复杂度也是O(nlogn),但在最坏情况下(如快速排序的输入为已经有序的数组),可能会退化到O(n^2)。不过,现代C++标准库通常会优化这种情况。
    • stable_sort()通常基于归并排序,保证了稳定性,时间复杂度为O(nlogn)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拓扑排序 —— 2. 力扣刷题207. 课程表

题目链接&#xff1a;https://leetcode.cn/problems/course-schedule/description/ 题目难度&#xff1a;中等 相关标签&#xff1a;拓扑排序 / 广度优先搜搜 BFS / 深度优先搜索 DFS 2.1 问题与分析 2.1.1 原题截图 2.1.2 题目分析 首先&#xff0c;理解题目后必须马上意识到…

【STM32】ST7789屏幕驱动

目录 CubeMX配置 配置SPI 开DMA 时钟树 堆栈大小 Keil工程配置 添加两个group 添加文件包含路径 驱动编写 写单字节函数 写字函数 写多字节函数 初始化函数 设置窗口函数 情况一&#xff1a;正常的0度旋转 情况二&#xff1a;顺时针90度旋转 情况三&#xff1…

10min速通Linux文件传输

实验环境 在Linux中传输文件需要借助网络以及sshd&#xff0c;我们可通过systemctl status sshd来查看sshd状态 若服务未开启我们可通过systemctl enable --now sshd来开启sshd服务 将/etc/ssh/sshd_config中的PermitRootLogin 状态修改为yes 传输文件 scp scp &#xff08;Sec…

dify windos,linux下载安装部署,提供百度云盘地址

dify1.0.1 windos安装包百度云盘地址 通过网盘分享的文件&#xff1a;dify-1.0.1.zip 链接: 百度网盘 请输入提取码 提取码: 1234 dify安装包 linux安装包百度云盘地址 通过网盘分享的文件&#xff1a;dify-1.0.1.tar.gz 链接: 百度网盘 请输入提取码 提取码: 1234 1.安装…

使用 TFIDF+分类器 范式进行企业级文本分类(二)

1.开场白 上一期讲了 TF-IDF 的底层原理&#xff0c;简单讲了一下它可以将文本转为向量形式&#xff0c;并搭配相应分类器做文本分类&#xff0c;且即便如今的企业实践中也十分常见。详情请见我的上一篇文章 从One-Hot到TF-IDF&#xff08;点我跳转&#xff09; 光说不练假把…

《车辆人机工程-汽车驾驶操纵实验》

汽车操纵装置有哪几种&#xff0c;各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件&#xff0c;主要包括以下几种&#xff0c;其特点如下&#xff1a; 一、方向盘&#xff08;转向操纵装置&#xff09; 作用&#xff1a;控制车辆行驶方向&#xff0c;通过转…

python高级编程一(生成器与高级编程)

@TOC 生成器 生成器使用 通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占 ⽤的空间都⽩⽩浪费了。所以,如果…

单片机Day05---动态数码管显示01234567

一、原理图 数组索引段码值二进制显示内容00x3f0011 1111010x060000 0110120x5b0101 1011230x4f0100 1111340x660110 0110450x6d0110 1101560x7d0111 1101670x070000 0111780x7f0111 1111890x6f0110 11119100x770111 0111A110x7c0111 1100B120x390011 1001C130x5e0101 1110D140…

muduo库源码分析: One Loop Per Thread

One Loop Per Thread的含义就是&#xff0c;一个EventLoop和一个线程唯一绑定&#xff0c;和这个EventLoop有关的&#xff0c;被这个EventLoop管辖的一切操作都必须在这个EventLoop绑定线程中执行 1.在MainEventLoop中&#xff0c;负责新连接建立的操作都要在MainEventLoop线程…

MCP结合高德地图完成配置

文章目录 1.MCP到底是什么2.cursor配置2.1配置之后的效果2.2如何进行正确的配置2.3高德地图获取key2.4选择匹配的模型 1.MCP到底是什么 作为学生&#xff0c;我们应该如何认识MCP&#xff1f;最近看到了好多跟MCP相关的文章&#xff0c;我觉得我们不应该盲目的追求热点的技术&…

重读《人件》Peopleware -(5)Ⅰ管理人力资源Ⅳ-质量—若时间允许

20世纪的心理学理论认为&#xff0c;人类的性格主要由少数几个基本本能所主导&#xff1a;生存、自尊、繁衍、领地等。这些本能直接嵌入大脑的“固件”中。我们可以在没有强烈情感的情况下理智地考虑这些本能&#xff08;就像你现在正在做的那样&#xff09;&#xff0c;但当我…

文献总结:AAAI2025-UniV2X-End-to-end autonomous driving through V2X cooperation

UniV2X 一、文章基本信息二、文章背景三、UniV2X框架1. 车路协同自动驾驶问题定义2. 稀疏-密集混合形态数据3. 交叉视图数据融合&#xff08;智能体融合&#xff09;4. 交叉视图数据融合&#xff08;车道融合&#xff09;5. 交叉视图数据融合&#xff08;占用融合&#xff09;6…

制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)

AI (神经网络模型) 可以认为是计算机的一种新的 “编程” 方式. 为了充分利用计算机, 只学习传统的编程 (编程语言/代码) 是不够的, 我们还要掌握 AI. 本文以 qwen2.5 和 llama-factory 举栗, 介绍语言模型 (LLM) 的微调 (LoRA SFT). 为了方便上手, 此处选择使用小模型 (qwen2…

Redis核心功能实现

前言 学习是个输入的过程&#xff0c;在进行输入之后再进行一些输出&#xff0c;比如写写文章&#xff0c;笔记&#xff0c;或者做一些技术串讲&#xff0c;虽然需要花费不少时间&#xff0c;但是好处很多&#xff0c;首先是能通过输出给自己的输入带来一些动力&#xff0c;然…

【连载3】基础智能体的进展与挑战综述

基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 2. 认知 人类认知是一种复杂的信息处理系统&#xff0c;它通过多个专门的神经回路协调运行…

MacOs java环境配置+maven环境配置踩坑实录

oracl官网下载jdk 1.8的安装包 注意可能需要注册&#xff01;&#xff01;&#xff01; 下载链接&#xff1a;下载地址点击 注意晚上就不要下载了 报错400 &#xff01;&#xff01;&#xff01; 1.点击安装嘛 2.配置环境变量 export JAVA_HOME/Library/Java/Java…

【Git】--- 企业级开发流程

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 本篇博客我们讲解Git在企业开发中的整体流程&#xff0c;理解Git在实际企业开发中的高效设计。 &#x1f3e0; 企业级开发流程 一个软件从零开始到最…

蓝桥杯嵌入式历年省赛客观题

一.第十五届客观题 第十四届省赛 十三届 十二届

解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题

使用蓝大的工作流《一键同时换头、换脸、发型、发色之双pulid技巧》 刚开始遇到的是不支持bf16的错误 根据《bf16 is only supported on A100 GPUs #33》中提到&#xff0c;修改pulidflux.py中的dtype 为 dtype torch.float16 后&#xff0c;出现新的错误&#xff0c;这个…

LabVIEW驱动开发的解决思路

在科研项目中&#xff0c;常面临将其他语言开发的定制采集设备驱动转换为 LabVIEW 适用形式的难题。特别是当原驱动支持匮乏、开发人员技术支持不足时&#xff0c;如何抉择解决路径成为关键。以下提供具体解决思路&#xff0c;助力高效解决问题。 ​ 一、评估现有驱动死磕的可…