Python排序算法揭秘:冒泡、插入、选择与快速排序的艺术

news2024/9/22 5:21:24

在这个信息爆炸的时代,数据处理变得尤为重要。作为数据处理的基础,排序算法无疑是编程中的核心技能之一。无论是处理简单的数组还是复杂的数据结构,掌握几种高效的排序算法都是必不可少的。本文将带你深入了解四种经典的排序算法——冒泡排序、插入排序、选择排序以及快速排序,并通过Python语言实现这些算法,展示它们在实际项目中的应用。

引言

排序算法不仅是一种技术手段,更是理解数据组织方式的重要途径。它帮助我们更好地理解和操作数据集,特别是在大数据分析、数据库管理和算法优化等领域发挥着关键作用。本篇博客将从零开始,逐步解析每种算法的工作原理、效率特点及其适用场景,力求让每一位读者都能从中学到有价值的知识。

基础语法介绍

冒泡排序

冒泡排序是最直观的排序方法之一。其基本思想是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复进行的,直到没有再需要交换,也就是说该数列已经排序完成。

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

插入排序

插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。这种方法简单易懂,但效率较低,适用于小型数据集或部分已排序的数据。

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

选择排序

选择排序也是一种简单直观的比较排序算法。它的基本思想是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

def selection_sort(arr):
    for i in range(len(arr)):
        min_idx = i
        for j in range(i+1, len(arr)):
            if arr[min_idx] > arr[j]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

快速排序

快速排序使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。其关键在于如何选择基准值,并通过一趟排序将待排记录分割成独立的两部分,其中一部分的所有记录都比另一部分的所有记录都要小,然后分别对这两部分记录继续进行排序,以达到整个序列有序。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

基础实例

假设我们有一个由随机整数组成的列表[3, 6, 1, 8, 4, 5],现在需要将其从小到大排序。

arr = [3, 6, 1, 8, 4, 5]

print("原始数组:", arr)

bubble_sorted = bubble_sort(arr.copy())
print("冒泡排序结果:", bubble_sorted)

insertion_sorted = insertion_sort(arr.copy())
print("插入排序结果:", insertion_sorted)

selection_sorted = selection_sort(arr.copy())
print("选择排序结果:", selection_sorted)

quick_sorted = quick_sort(arr.copy())
print("快速排序结果:", quick_sorted)

进阶实例

在实际开发中,排序算法可能面临更复杂的挑战,例如需要根据特定条件(如日期、字符串长度等)对对象进行排序。这里我们以一个简单的例子来说明如何自定义排序规则。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f"{self.name} ({self.age})"

people = [
    Person("Alice", 25),
    Person("Bob", 20),
    Person("Carol", 30)
]

def custom_sort(person):
    return person.age

sorted_people = sorted(people, key=custom_sort)
for person in sorted_people:
    print(person)

实战案例

在某电商网站的商品推荐系统中,需要根据用户的购买历史、浏览记录等多个因素综合评分后对商品进行排序展示。这里可以采用快速排序算法结合权重计算的方式,实现高效且个性化的商品排序。

def recommend_products(history, products):
    # 假设history是一个用户的历史购买记录
    # products是一个商品列表,每个商品都有id、名称、类别等属性
    # 此处省略了具体评分逻辑,仅演示排序过程
    weighted_products = []
    for product in products:
        score = calculate_score(history, product)  # 模拟评分函数
        weighted_products.append((product, score))
    
    # 使用快速排序按评分降序排列
    sorted_products = quick_sort(weighted_products, key=lambda x: x[1], reverse=True)
    
    # 返回排序后的商品ID列表
    return [product[0].id for product in sorted_products]

# 示例调用
history = [101, 102, 103]  # 用户历史购买记录
products = [
    Product(100, "Product A", "Category 1"),
    Product(101, "Product B", "Category 2"),
    Product(102, "Product C", "Category 3")
]
recommended = recommend_products(history, products)
print(recommended)

扩展讨论

排序算法的选择往往取决于具体的应用场景。例如,在处理大规模数据时,快速排序因其平均时间复杂度为O(n log n)而成为首选;而在处理小规模数据或部分已排序的数据时,则可以选择插入排序,因为它在这些情况下表现更好。此外,还应考虑算法的空间复杂度、稳定性等因素。总之,没有一种算法能够适应所有情况,合理选择合适的排序算法对于提高程序性能至关重要。

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

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

相关文章

(done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)

参考&#xff1a;https://www.youtube.com/watch?vZZ9u1vUtcIA 声学特征描述了声音&#xff0c;不同特征捕捉声音的不同方面性质 声学特征有助于我们构建智能声学系统 声学特征分类有&#xff1a; 1.抽象等级 2.时域视野 3.音乐的部分 4.信号域 5.机器学习方法 如下图展示…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings&#xff0c;以便创建只需很少或无需源代码的应用程序。 在本教程中&#xff0c;您将创建一个高清多设备应用程序&#xff0c;该应用程序使用 LiveBindings 绑定多个对象&#xff0c;以更改圆…

[SAP ABAP] 生成表维护视图

SAP由于数据量较大&#xff0c;很多自定义表都需要通过用户自行去维护&#xff0c;一般可以直接在SE16N对数据字典进行维护数据&#xff0c;但不是每个用户都有其操作权限&#xff0c;而且直接在数据字典上操作数据有很高的风险&#xff0c;因此SAP提供了表维护视图生成器&…

算法学习2

学习目录 一.插入排序 一.插入排序 从数组的第一个元素开始&#xff0c;当前元素与其前一个元素进行比较&#xff1b; 大于&#xff08;或小于时&#xff09;将其进行交换&#xff0c;即当前元素替换到前一位&#xff1b; 再将该元素与替换后位置的前一个元素进行交换&#xf…

【全网最全】2024年华为杯研赛A题保奖思路+matlab/py代码+成品论文等(后续会更新完整

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下卡片链接&#xff0c;那是获取资料的入口&#xff01; 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https://qm.qq.com/q/goQLLNwfgQhttps://qm.qq.com/q/goQLLNwfgQ A 风电场有功功率优化分配思路 这是…

分页插件、代码生成器

01-分页插件、代码生成器 分页插件使用 首先在pom.xml文件中导入依赖 然后再mybatis-config.xml文件中写入插件 在测试类中写入方法 在mybatis.xml文件中设置plugins标签里的属性helperDialectkeyi自动检查当前数据库用的什么,不用设置也行,默认就设置了 分页插件里面属性详解…

XXL-JOB分片概念讲解

3. 分片功能讲解 3.1 案例需求&#xff1a; 1.我们现在实现这样的需求&#xff0c;在指定节假日&#xff0c;需要给平台的所有用户去发送祝福的短信 3.2.编码实现&#xff1a; a.初始化数据 1.在数据库中导入xxl_job_demo.sql数据 b.集成Druid&MyBatis 1.添加依赖 &…

VisualPromptGFSS

COCO-20 i ^i i太大&#xff0c;不建议复现

利士策分享,华为三折叠手机:重塑未来科技生活的里程碑

利士策分享&#xff0c;华为三折叠手机&#xff1a;重塑未来科技生活的里程碑 在这个日新月异的科技时代&#xff0c;华为再次以惊人的创新力&#xff0c;引领我们迈向智能设备的全新纪元——华为三折叠手机&#xff0c; 不仅是技术的飞跃&#xff0c;更是对未来生活方式的一次…

初识set,map

已知快速查找&#xff1a; 1.暴力查找 2.排序二分查找&#xff08;插入删除麻烦&#xff09; 3.搜索树->二叉搜索树&#xff08;极端情况n&#xff09;->平衡树(AVL树&#xff0c;红黑树&#xff09;(logn高度太高&#xff0c;搜索次数多&#xff09;->多叉平衡搜索…

发现编程的全新境界——明基RD280U显示器使用体验

前言 在大学的四年里&#xff0c;我几乎每天都泡在实验室&#xff0c;盯着电脑屏幕&#xff0c;一行行地码代码。那时&#xff0c;学校提供的显示器是非常基础的款式&#xff0c;功能简单&#xff0c;几乎没有任何特别之处&#xff0c;甚至配置也比较低。那个时候&#xff0c;…

【MySQL 01】数据库基础

目录 1.数据库是什么 2.基本操作 数据库服务器连接操作 数据库和数据库表的创建 服务器&#xff0c;数据库&#xff0c;表关系 数据逻辑存储 3.MySQL架构 4.SQL分类 5.存储引擎 1.数据库是什么 mysql&&mysqld&#xff1a; mysql&#xff1a;这通常指的是 MySQL …

PMBOK® 第六版 排列活动顺序

目录 读后感—PMBOK第六版 目录 职场中有句玩笑话&#xff1a;“工作是永远做不完的&#xff0c;任何时候都不可能做完。”这里所吐槽的要点就在于工作任务繁多以及工作缺乏秩序。工作确实是做不完的&#xff0c;倘若工作都能完成&#xff0c;那也就不需要工作了。 工作中令人…

统信服务器操作系统【搭建FTP】设置介绍

如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。 文章目录 功能概述一、功能介绍二、准备环境三、安装步骤1. 在…

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福&#xff01; MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合&#xff08;Composition)的逻辑和编程&#xff08;Programmable&#xff09;的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…

MobaXterm : Network error: Connection refused(连接被拒绝)

具体报错如下如所示&#xff1a; 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动&#xff08;启用返回 enable&#xff09; sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…

部标(JT/T1078)流媒体对接说明

1.前言 最近在配合客户开发流媒体相关的服务的时候&#xff0c;整理了一些对接过程资料&#xff0c;这里做个分享与记录。流媒体的对接主要牵扯到4个方面&#xff1a; &#xff08;1&#xff09;平台端&#xff1a;业务端系统&#xff0c;包含前端呈现界面。 &#xff08;2&a…

Spring IDEA 2024 自动生成get和set以及toString方法

1.简介 在IDEA中使用自带功能可以自动生成get和set以及toString方法 2.步骤 在目标类中右键&#xff0c;选择生成 选择Getter和Setter就可以生成每个属性对应的set和get方法&#xff0c; 选择toString就可以生成类的toString方法&#xff0c;

推荐一款PS VR2电脑PC适配器 / 转接板方案

一、引言 随着虚拟现实技术的不断发展&#xff0c;PS VR2 为用户带来了沉浸式的游戏和娱乐体验。然而&#xff0c;为了让 PS VR2 能够与电脑连接&#xff0c;充分发挥其性能并拓展使用场景&#xff0c;需要开发一款电脑适配器 / 转接板。本技术文档方案旨在详细阐述该适配器 / …