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

news2024/11/17 22:20:47

更多资料获取

📚 个人网站: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 arr

arr = [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 - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

arr = [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 = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = selection_sort(arr)
print("选择排序结果:", sorted_arr)

快速排序

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

# 快速排序示例代码
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    else:
        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) // 2
        left_half = arr[:mid]
        right_half = arr[mid:]

        merge_sort(left_half)
        merge_sort(right_half)

        i = j = k = 0

        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1

        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1

        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 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 = name
        self.age = age

    def __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 time

arr = 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.coloradmin.cn/o/1283321.html

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

相关文章

基于腾讯云手把手教你搭建网站

目录 前言前期准备工作具体搭建网站番外篇&#xff1a;网站开发及优化结束语 前言 在当今数字化时代浪潮之下&#xff0c;作为开发者拥有一个属于自己的网站是非常有必要的&#xff0c;也是展示个人形象、打造影响力和给别人提供服务的重要途径。网站不仅可以作为打造自己影响…

Rpg游戏地形生成

rpg游戏中的地形一般使用高度图的形式来绘制。写了几个随机生成高度图的算法。 最常见的是基于分形算法生成高度图&#xff0c;网上有很多资料&#xff0c;这里不再介绍。 一种生成断层效果高度图的算法 //!生成断层效果的高度图 void TerrainData::FillFaultSurface(float …

12.4作业

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

【刷题日志】牛客 HJ73 计算日期到天数转换

计算日期到天数转换 阅读题目解题方案 及 解题思路方法一 . 手撕日期类方法二 . 分别直接算出平年和闰年每个月的时间 并对应下标存入数组中&#xff0c;判断该年份为平年还是闰年&#xff0c;再 for循环依次求和优化&#xff1a;也不用分别算出平年和闰年的每个月的时间&#…

IntelliJ IDEA设置中文界面

1.下载中文插件 2. 点击重启IDE 3.问题就解决啦&#xff01;

目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

文章目录 前言1.IOU_Loss&#xff08;Intersection over Union Loss&#xff09;2.GIOU_Loss&#xff08;Generalized Intersection over Union Loss&#xff09;3.DIOU_Loss&#xff08;Distance Intersection over Union Loss&#xff09;4.CIOU_Loss&#xff08;Complete In…

2023年5月电子学会青少年软件编程 Python编程等级考试一级真题解析(选择题)

2023年5月Python编程等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、可以对Python代码进行多行注释的是 A、# B、“ ” C、‘’‘ ’‘’ D、‘ ’ 答案:C 考点分析:考查python中注释,python中注释分为单行注释和多行注释,单行注释使用井号(#),多…

表达式二叉树的中序遍历:2017年408算法题

算法思想 表达式二叉树的中序遍历即中缀表达式除了根节点和叶结点&#xff0c;遍历到其他结点时在遍历其左子树前加上左括号&#xff0c;在遍历完右子树后加上右括号 算法实现 //中序遍历&#xff0c;deep从1开始&#xff0c;即根节点的深度为1 void midOrder(BTree T,int …

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…

鸿宇多用户商城user.php RCE漏洞复现

0x01 产品简介 鸿宇多用户商城是一款支持各行业的多商家入驻型电商平台系统,商家版APP,微信商城,小程序及各种主流营销模块应有尽有,是一个功能强大的电子商务平台,旨在为企业和个人提供全面的在线购物解决方案。 0x02 漏洞概述 鸿宇多用户商城 user.php 存在任意命令执行漏洞…

jira创建用例,与任务关联

项目用的jira&#xff0c;但之前的用例放在禅道上&#xff0c;或者归档于svn&#xff0c;都不是很好用&#xff0c;所以研究了下jira的用法 1、下载插件&#xff1a; synapseRT - Test management and QA in JIRA 完成后在tab会多出一个test 2、常用的功能 1、建立用例&#…

TCP三次握手与四次挥手:推荐学习资料、过程详解、面试相关题与回答模板(为什么不是两次握手等精讲)

推荐资料&#xff08;建议按照顺序先都看完&#xff0c;再看本篇文章&#xff09; https://www.bilibili.com/video/BV18h41187Ep/ https://www.bilibili.com/video/BV1at4y1Q77b/ https://bbs.huaweicloud.com/blogs/277728 https://blog.csdn.net/dreamispossible/article/d…

paddleocr文本检测改进变迁

数据增强&#xff1a; BDA(Base Data Augmentation)&#xff1a;色调变换&#xff0c;透明度变换&#xff0c;旋转&#xff0c;背景模糊&#xff0c;饱和度变换。 图像变换类&#xff1a;AutoAugment&#xff0c;RandAugment 图像裁剪类&#xff1a;CutOut、RandErasing、Hi…

【UE5】使用场系统炸毁一堵墙

效果 步骤 1. 新建一个空白项目 2. 新建一个Basic关卡&#xff0c;然后添加一个第三人称游戏和初学者内容包到内容浏览器 3. 在场景中添加一堵墙 4. 选项模式选择“破裂” 点击新建 新建一个文件夹用于存储几何体集 点击“统一” 最小和最大Voronoi点数都设置为100 点击“破…

【java设计模式】——代理设计模式,两种举例说明

代理设计模式 1.介绍 Spring 框架中AOP底层使用动态代理设计模式。通过学习动态代理设计模式可以很好的理解Spring框架AOP底层 代理模式&#xff08;Proxy&#xff09;是GoF23种设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理&am…

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

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

天池XGBoost,重写柱状图代码

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

全网最牛最“刑”的Fiddler移动端抓包

本篇文章&#xff0c;博主想使用通俗易懂的话语&#xff0c;让大家明白以下内容&#xff1a; 什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包 抓包 包 (Packet) 是TCP/IP协议通信传输中的数据单位&#xff0c;一般也称“数据包”。 我们平常…

二维码智慧门牌管理系统升级:轻松解决重新制牌问题

文章目录 前言一、更便捷的申请方式二、系统优势 前言 随着科技的快速发展&#xff0c;智能化管理已经成为我们日常生活的一部分。最近&#xff0c;为了满足人们对门牌类型更换、门牌丢失等需要重新制牌的需求&#xff0c;二维码智慧门牌管理系统升级了解决方案&#xff0c;为…

Python如何从文件中读取数据

从文件中读取数据 1. 读取整个文件 要读取文件&#xff0c;首先来创建一个文件&#xff1a; 然后打开并读取这个文件&#xff0c;再将其内容显示到屏幕上&#xff1a; file_reader.py with open(pi_digits.txt) as file_object:contents file_object.read()print(contents)…