Python及C++中的排序

一、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.mzph.cn/bicheng/76639.shtml

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

相关文章

详解springcloud nacos使用

1.nacos server安装 下载 Nacos Server 2.5.1 https://nacos.io/download/nacos-server/?spm5238cd80.2ef5001f.0.0.3f613b7clM2t6D 部署文档&#xff1a;https://nacos.io/docs/latest/manual/admin/deployment/deployment-standalone/?spm5238cd80.6a33be36.0.0.25b41e5d…

第三篇:Python数据结构深度解析与工程实践

第一章:列表与字典 1.1 列表的工程级应用 1.1.1 动态数组实现机制 Python列表底层采用动态数组结构,初始分配8个元素空间,当空间不足时按0,4,8,16,25,35...的公式扩容,每次扩容增加约12.5%的容量 通过sys模块可验证扩容过程: import sys lst = [] prev_size = 0 for …

NOIP2015提高组.运输计划

目录 题目算法标签: 树上倍增, l c a lca lca, 前缀和, 树上差分, 二分思路代码* v e c t o r vector vector存邻接表会超时 题目 521. 运输计划 算法标签: 树上倍增, l c a lca lca, 前缀和, 树上差分, 二分 思路 注意到答案是具有二分性质的, 对于某个时间 m i d mid …

MySQL数据过滤、转换与标准化

数据处理是数据库操作的重要组成部分&#xff0c;尤其是在大量数据中查找、转换和规范化目标信息的过程中。为了确保数据的有效性与一致性&#xff0c;MySQL提供了一系列数据过滤、转换与标准化的功能。 本教程将深入探讨数据过滤和转换的基本方法及应用&#xff0c;内容涵盖数…

英语学习4.11

gear 【名词 / 动词】 &#x1f449; 关键词&#xff1a;齿轮、装备、调节、使适应 名词释义&#xff1a; 齿轮&#xff1a; 一种机械装置&#xff0c;用于传递动力或调节运动。 装备、工具&#xff1a; 指用于某种活动的设备或工具。 汽车档位&#xff1a; 汽车中用于改变…

SDC命令详解:使用相对路径访问设计对象(current_instance命令)

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 在使用get_cells等命令访问设计对象时&#xff0c;需要指定设计对象的名字&#xff0c;这个名字是一个相对路径&#xff0c;本文就将对此进行讨论。 相对路径 使…

【问题记录】记录2个安装Centos/Anolis系统卡死在安装包阶段的问题?(硬盘分区?换设备)

背景 问题就不详细记录了&#xff0c;本文记录的是Centos/Anolis安装中卡主的问题。这个问题遇到过几十次了&#xff0c;尝试过各种方法。最近一个偶然因素找到了原因。然后翻看历史上出现这个问题的照片居然是相同的地方卡死。。。 有点意思。特此记录&#xff0c;希望未来遇…

微信小程序中的openid的作用

微信小程序中的openid的作用 引言 在当今数字化时代&#xff0c;用户体验成为了产品成功与否的关键因素之一。微信小程序作为连接用户与服务的重要桥梁&#xff0c;在提升用户体验方面发挥着重要作用。其中&#xff0c; openid&#xff08;开放身份标识符&#xff09;是微信小…

《Python星球日记》第25天:Pandas 数据分析

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 订阅专栏&#xff1a;《Python星球日记》 目录 一、引言二、数据分组与聚合1. 分组操…

分布式系统-脑裂,redis的解决方案

感谢你的反馈&#xff01;很高兴能帮到你。关于你提到的“脑裂”&#xff08;split-brain&#xff09;&#xff0c;这是一个分布式系统中的常见术语&#xff0c;尤其在像 Redis Cluster 这样的高可用集群中会涉及。既然你问到了&#xff0c;我会从头解释“脑裂”的含义、Redis …

重构艺术 | 如何优雅地“提炼函数“

在工作中总数遇到非常多的长代码&#xff0c;俗称“屎山”&#xff0c;这类代码读起来特别费劲。自己想重构一遍&#xff0c;但是总感觉缺乏经验指导&#xff0c;因此&#xff0c;多读书&#xff0c;读好书可能是最优解之一。读《重构改善即有代码的设计》有感&#xff0c;便写…

每天学一个 Linux 命令(13):touch

Linux 文件管理命令:touch touch 是 Linux 中一个简单但高频使用的命令,主要用于创建空文件或修改文件的时间戳(访问时间、修改时间)。它是文件管理和脚本操作的实用工具。 1. 命令作用 创建空文件:快速生成一个或多个空白文件。更新时间戳:修改文件的访问时间(Access …

STM32HAL库学习笔记

目录 定时器 一些小细节 输入捕获计算信号频率 输入捕获计算占空比与频率 使用定时器不改变占空比的同时改变频率的方法 串口 重定向原理 重定向代码 怎么从串口接收到的字符串数据中解析出float型的数据 strchr sscanf memset 第一种实现方法 RTC实时时钟 LCD显…

Docker 镜像、容器与数据卷的高效管理:最佳实践与自动化脚本20250411

Docker 镜像、容器与数据卷的高效管理&#xff1a;最佳实践与自动化脚本 引言 在现代软件开发中&#xff0c;容器化技术正变得越来越重要。Docker 作为容器化的代表工具&#xff0c;在各大企业中得到了广泛的应用。然而&#xff0c;随着容器化应用的增多&#xff0c;如何高效…

Selenium之Actions事件

鼠标、键盘组合键 在使用selenium的时候&#xff0c;有的时候我们需要鼠标单击、双击、拖动&#xff1b;或者是按下键盘的某个键&#xff0c;松开某个按键&#xff0c;以及组合键的使用&#xff1b;今天我们就来看一看&#xff0c;怎么样实现上面的操作 先把准备工作做好&…

如何在 CentOS 7 系统上以容器方式部署 GitLab,使用 ZeroNews 通过互联网访问 GitLab 私有仓库,进行代码版本发布与更新

第 1 步&#xff1a; 部署 GitLab 容器​ 在开始部署 GitLab 容器之前&#xff0c;您需要创建本地目录来存储 GitLab 数据、配置和日志&#xff1a; #创建本地目录 mkdir -p /opt/docker/gitlab/data mkdir -p /opt/docker/gitlab/config mkdir -p /opt/docker/gitlab/log#gi…

.py文件和.ipynb文件的区别:完整教程

一、概述 Python开发者常用的两种文件格式.py和.ipynb各有特点&#xff0c;本教程将通过对比分析、代码示例和场景说明&#xff0c;帮助开发者全面理解二者的区别与联系。 二、核心区别对比 1. 文件格式本质 特性.ipynb文件.py文件文件类型JSON结构化文档纯文本文件存储内容…

Go 字符串四种拼接方式的性能对比

简介 使用完整的基准测试代码文件&#xff0c;可以直接运行来比较四种字符串拼接方法的性能。 for 索引 的方式 for range 的方式 strings.Join 的方式 strings.Builder 的方式 写一个基准测试文件 echo_bench_test.go package mainimport ("os""stri…

从代码学习深度学习 - Bahdanau注意力 PyTorch版

文章目录 1. 前言为什么选择Bahdanau注意力本文目标与预备知识2. Bahdanau注意力机制概述注意力机制简述加性注意力与乘性注意力对比Bahdanau注意力的数学原理与流程图数学原理流程图可视化与直观理解3. 数据准备与预处理数据集简介数据加载与预处理1. 读取数据集2. 预处理文本…

19【动手学深度学习】卷积层

1. 从全连接到卷积 2. 图像卷积 3. 图形卷积代码 互相关操作 import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""计算2维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0]-h1, X.shape[1]-w 1))for …