掌握排序的艺术:Python中sorted()函数全面解析!

更多资料获取

📚 个人网站:ipengtao.com


1. 引言

排序在编程中是一个基本且重要的操作,而 Python 中的 sorted() 函数则为我们提供了强大的排序能力。在本篇文章中,我们将深入研究不同排序算法、sorted() 函数的灵活性,以及各种排序场景下的最佳实践。

2. 排序算法概述

冒泡排序

冒泡排序是一种简单的排序算法,通过多次遍历比较相邻元素并交换来实现排序。以下是一个冒泡排序的例子:

# 冒泡排序示例代码
def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n - i - 1):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arrarr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("冒泡排序结果:", sorted_arr)

插入排序

插入排序通过构建有序序列,逐个将未排序的元素插入到已排序序列的适当位置来排序。以下是一个插入排序的例子:

# 插入排序示例代码
def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arrarr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = insertion_sort(arr)
print("插入排序结果:", sorted_arr)

选择排序

选择排序不断地从未排序部分找到最小元素,并将其放到已排序部分的末尾。以下是一个选择排序的例子:

# 选择排序示例代码
def selection_sort(arr):for i in range(len(arr)):min_idx = ifor j in range(i + 1, len(arr)):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arrarr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = selection_sort(arr)
print("选择排序结果:", sorted_arr)

快速排序

快速排序是一种高效的排序算法,采用分治的策略,通过选定基准值将数组分割成较小和较大的两个子数组。以下是一个快速排序的例子:

# 快速排序示例代码
def quick_sort(arr):if len(arr) <= 1:return arrelse:pivot = arr[0]less_than_pivot = [x for x in arr[1:] if x <= pivot]greater_than_pivot = [x for x in arr[1:] if x > pivot]return quick_sort(less_than_pivot) + [pivot] + quick_sort(greater_than_pivot)# 使用示例
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = quick_sort(arr)
print("快速排序结果:", sorted_arr)

在这个示例中,quick_sort() 函数递归地将数组分成小于基准值和大于基准值的两个子数组,直至每个子数组的长度小于等于1,即达到基本情形,然后将结果合并成一个有序数组。

归并排序

归并排序是一种分治算法,将原始列表分为较小的列表,直至每个列表只有一个元素,然后合并成一个有序列表。以下是一个归并排序的例子:

# 归并排序示例代码
def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half):if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1# 使用示例
arr = [64, 34, 25, 12, 22, 11, 90]
merge_sort(arr)
print("归并排序结果:", arr)

在这个示例中,merge_sort() 函数使用递归的方式将列表分解成较小的子列表,然后再将这些子列表合并成一个有序的列表。归并排序的时间复杂度始终为 O(n log n),保持较稳定。

3. sorted() 函数基础

sorted() 函数是 Python 中的内置函数,用于排序列表、元组和字典。以下是 sorted() 函数的基本用法:

# `sorted()` 函数基本用法
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = sorted(arr)
print("基本排序结果:", sorted_arr)

4. 多样化的排序方法

稳定性排序

稳定性排序能够保持相等元素之间的原始顺序,尤其在多次排序时更为重要。下面是稳定性排序的例子:

# 稳定性排序示例代码
employees = [{'name': 'Alice', 'age': 25},{'name': 'Bob', 'age': 30},{'name': 'Alice', 'age': 20},{'name': 'Charlie', 'age': 25}
]sorted_employees = sorted(employees, key=lambda x: x['name'])
print("稳定性排序结果:", sorted_employees)

逆序排序

sorted() 函数允许进行逆序排序。下面是逆序排序的例子:

# 逆序排序示例代码
arr = [64, 34, 25, 12, 22, 11, 90]
reverse_sorted_arr = sorted(arr, reverse=True)
print("逆序排序结果:", reverse_sorted_arr)

5. 复杂对象的排序

sorted() 函数不仅可以用于数字,还可以对自定义对象进行排序,通过使用类的特殊方法(例如 __lt__, __gt__)来实现。以下是自定义对象排序的例子:

# 对自定义对象排序示例代码
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person(name={self.name}, age={self.age})"persons = [Person('Alice', 25), Person('Bob', 20), Person('Charlie', 30)]
sorted_persons = sorted(persons, key=lambda x: x.age)
print("自定义对象排序结果:", sorted_persons)

6. 性能分析和最佳实践

排序算法的选择对于程序性能至关重要,我们将进行排序算法的性能比较分析并提供最佳实践建议。

排序算法性能比较

下面是不同排序算法的性能比较示例代码:

# 排序算法性能比较示例代码
import timearr = list(range(10000, 0, -1))start_time = time.time()
sorted_arr = sorted(arr)  # 使用内置排序函数
end_time = time.time()
print(f"内置排序函数运行时间: {end_time - start_time}秒")start_time = time.time()
bubble_sort(arr.copy())  # 使用冒泡排序
end_time = time.time()
print(f"冒泡排序运行时间: {end_time - start_time}秒")

最佳实践

绝对,以下是一些关于排序和使用 sorted() 函数的最佳实践:

利用关键字参数 key 进行灵活排序

利用 key 参数对复杂数据结构进行排序,比如排序字典的值、按照对象的某个属性进行排序等。

# 利用 key 参数对复杂数据结构进行排序示例
# 对字典的值进行排序
dictionary = {'apple': 30, 'orange': 20, 'banana': 50, 'grapes': 10}
sorted_dict = sorted(dictionary, key=lambda x: dictionary[x])
print(sorted_dict)  # 输出按值排序的键列表

避免修改原始数据

确保排序时不会对原始数据进行修改,以免造成不可预料的影响。

# 避免修改原始数据示例
arr = [4, 3, 1, 2]
sorted_arr = sorted(arr)  # 创建一个新的已排序列表
print(sorted_arr)  # 输出已排序列表
print(arr)  # 输出原始列表,未被修改

选择合适的排序算法

根据数据规模和类型选择适当的排序算法,以保证最佳性能。

# 选择合适的排序算法示例
import random# 对较小规模的数据使用选择排序
small_data = random.sample(range(1, 50), 10)
print("Small data:", small_data)
sorted_small_data = sorted(small_data)  # 使用内置排序
print("Sorted Small data:", sorted_small_data)# 对较大规模的数据使用快速排序
large_data = random.sample(range(1, 100000), 10000)
print("Large data:", large_data[:10])  # 打印前10个数据,避免太多输出
sorted_large_data = sorted(large_data)  # 使用内置排序
print("Sorted Large data:", sorted_large_data[:10])  # 打印前10个排序后的数据,避免太多输出

总结

排序算法在计算机科学和编程中扮演着至关重要的角色,sorted() 函数是 Python 中最为灵活和便捷的排序工具之一。本文介绍了几种经典的排序算法,例如冒泡排序、插入排序、选择排序、快速排序和归并排序。每个算法都有其独特的优势和特点,对不同类型的数据和场景有不同的适用性。

sorted() 函数在排序过程中提供了便利性和灵活性,能够应对各种数据类型的排序需求。此外,最佳实践内容包括了使用关键字参数 key 进行定制排序、避免对原始数据进行修改、选择适当的排序算法以及了解时间复杂度和空间复杂度等。这些最佳实践能够帮助开发人员编写更加高效、清晰的代码,并有效地处理排序需求。

排序算法的选择需要根据具体情况,考虑数据规模、性能和算法稳定性等方面的因素。了解各种算法的特点和适用场景,以及sorted() 函数的应用方法,将有助于程序员在实际编码中更好地应对排序需求,提高代码效率和性能。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

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

相关文章

数据结构与算法之美学习笔记:30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?

目录 前言如何理解“图”&#xff1f;邻接矩阵存储方法邻接表存储方法解答开篇内容小结 前言 本节课程思维导图&#xff1a; 微博、微信这些社交软件我想你肯定都玩过吧。在微博中&#xff0c;两个人可以互相关注&#xff1b;在微信中&#xff0c;两个人可以互加好友。那你知道…

项目管理实践:如何进行项目分解?

项目管理是一个复杂的工程&#xff0c;作为项目管理者&#xff0c;项目经理应该有着统筹管理项目全局的能力。 创建一个项目计划可分为四步&#xff1a; 1、明确项目目标 项目在成立或创建之初就要有清晰明确的目标&#xff1b; 项目达到什么目的&#xff1f; 项目目标是…

安美数字酒店宽带运营系统 SQL注入漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统隶属于安美世纪(北京)科技有限公司开发的一套酒店宽带管理系统。 0x02 漏洞概述 安美数字酒店宽带运营系统 online_status.php、language.php等接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过此漏洞获取数据库权限,进一步利用可…

快手视频如何去掉水印?三个简单好用视频去水印方法

快手视频如何去掉水印&#xff1f;尽管新兴的短视频平台如春笋般涌现&#xff0c;吸引了众多观众在业余时间浏览和分享视频&#xff0c;快手作为当下主流短视频之一&#xff0c;许多自媒体创作者也常常会下载一些热门的视频素材进行二次编辑。然而&#xff0c;他们都可能会面临…

【超详细教程】基于html+js实现轮播图

轮播图是现代网页设计中常见的元素之一&#xff0c;它能够展示多张图片或内容&#xff0c;在有限的空间内循环播放&#xff0c;提升网页的视觉效果和用户体验。下面将以一个简单的网页轮播图为例&#xff0c;说明如何基于HTML和JavaScript实现。 ​ 1、R5Ai智能助手 chatgpt国…

揭开 Java on Azure 开发工具未来6个月路线图的神秘面纱

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Java on Azure 工具十月份更新。在本次更新中&#xff0c;我们将分享未来几个月在 Java on Azure 开发工具方面的投资路线图。此外&…

JVM==>图解字节码指令

一&#xff0c;原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中&#xff0c;交给CPU运行 1&#xff09;常量池载入运行时常量池 我们发现 10 并没有被存入常量池中&#xff0c; 这是因为short范围以内的数字不会…

如何有效进行测试执行进度计划

测试执行通常都是处于软件测试生命周期的关键路径上&#xff0c;它不仅在测试过程中占有重要的地位&#xff0c;并且也会花费大量的测试时间。针对测试执行而进行的计划&#xff0c;即测试执行进度计划&#xff0c;是进行测试执行进度控制的基础。在进行测试执行进度计划制订的…

Web APIs—介绍、获取DOM对象、操作元素内容、综合案例—年会抽奖案例、操作元素属性、间歇函数、综合案例—轮播图定时器版

版本说明 当前版本号[20231204]。 版本修改说明20231204初版 目录 文章目录 版本说明目录复习变量声明 Web APIs - 第1天笔记介绍概念DOM 树DOM 节点document 获取DOM对象案例— 控制台依次输出3个li的DOM对象 操作元素内容综合案例——年会抽奖案例操作元素属性常用属性修改…

【以太网物理层】DM9161A

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…

我有才知识付费平台搭建,一分钟搭建你的专属知识服务平台

一站式线上线下课程传播 丰富的内容展示形式&#xff0c;满足用户不同层次的学习需求&#xff0c;提高流量转化 支持音频、视频、电子书、图文、动态等多模式课程展示形式&#xff0c;同时还支持免费、VIP会员、独立付费等多种服务方式&#xff0c;满足不同渠道场景推广&…

前端入口教程_web01

web标准 记得看&#xff01; html&#xff1a;表示整个页面 head&#xff1a; titile&#xff1a; body&#xff1a; 常用标签 1.标题标签 2.段落标签 3.换行标签 4.文本格式化标签 5. 和 标签 6.图像标签 相对路径–用来插自己本地的图片 #### 绝对路径–用来插网上找的图…

天池XGBoost,重写柱状图代码

天池XGBoost 地址 重写柱状图代码&#xff1a;我没考虑复杂度&#xff0c;只考虑直观理解 原文统计地点是否降雨来画柱状图实在是太麻烦了&#xff0c;我重写了一下。最麻烦的就是数据处理。我的思路是&#xff1a; 首先取下雨的全部数据data[data[RainTomorrow] Yes] 然后…

SQL Server 数据库,创建数据表(使用T-SQL语句)

2.3表的基本概念 表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似&#xff0c;都是 按行和列的格式组织的&#xff0c;每行代表一条唯一的记录&#xff0c;每列代表记录中的一个字段.例如&#xff0c;在包含公 司员工信息的表中&#xff0c;每行…

虾皮数据分析网站:了解Shopee市场趋势与优化运营的利器

在如今的电商时代&#xff0c;越来越多的人选择在虾皮购物&#xff08;Shopee&#xff09;平台上开设自己的店铺。然而&#xff0c;要在这个竞争激烈的市场中脱颖而出并取得成功&#xff0c;并不是一件容易的事情。为了更好地了解市场趋势、优化产品和店铺运营&#xff0c;了解…

​ 华大基因发布《2023年全球地中海贫血认知现状报告》

在地中海沿岸地区、非洲、中东、东南亚和中国南部&#xff0c;一种名为地中海贫血&#xff08;以下简称“地贫”&#xff09;的遗传性血红蛋白疾病十分高发&#xff0c;已成为严重危害公共健康和社会稳定的重大问题。近日&#xff0c;华大基因发布《2023年全球地中海贫血认知现…

鸿蒙系统扫盲(四):鸿蒙使用的是微内核?

我们常说&#xff0c;看一个系统是不是自研&#xff0c;就看它的内核&#xff0c;常见的内核分为&#xff1a;宏内核和微内核&#xff0c;当然还有两者结合体&#xff0c;他们到底有什么区别&#xff1f; 1.白话宏内核和微内核 有一天&#xff0c;你结婚了&#xff0c;你和你…

微机原理9

一、单项选择题(本大题共15小题,每小题3分、共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8088 系统的内存最大容量为 16MB. 其地址总线为&#xff08;&#xff09; A. 16 位 B. 20 位 C. 24 位 D. 32 位 2,以CPU为核心…

2023年12月4日:多继承

代码 #include <iostream>using namespace std;class Sofa { private:string sit;int *len; public:Sofa(){cout << "Sofa::无参构造函数" << endl;}Sofa(string sit,int len):sit(sit),len(new int(len)){cout << "Sofa::有参构造函数…

【uni-app】赋予你的APP(Android原生)小程序开发能力

采用DCloud(数字天堂&#xff08;北京&#xff09;网络技术有限公司)的uniMPsdk(uni小程序SDK)&#xff0c;是为原生App打造的可运行基于 uni-app 开发的小程序前端项目的框架&#xff0c;从而帮助原生App快速获取小程序的能力。 uni-app文档地址(小程序开发人员开发用) uniMP…