当前位置: 首页 > news >正文

Python系列(20)—— 排序算法

Python中的排序算法

一、引言

排序算法是计算机科学中的基本算法之一,用于将一组数据按照特定的顺序进行排列。Python提供了多种排序算法的实现,包括内置的排序函数和手动实现的排序算法。本文将介绍几种常见的排序算法,并通过代码实例来展示它们的实现。

二、冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,通过重复遍历待排序的列表,比较相邻的元素并交换位置,直到列表有序为止。

代码实例

def bubble_sort(arr):n = len(arr)for i in range(n):# 标记,表示是否发生了交换swapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = True# 如果没有发生交换,说明列表已经有序,可以提前结束循环if not swapped:break# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的列表:", arr)

三、选择排序(Selection Sort)

选择排序通过每次从未排序的元素中选择最小(或最大)的元素,将其放置到已排序的序列的末尾(或开头),直到所有元素都排序完毕。

代码实例

def selection_sort(arr):n = len(arr)for i in range(n):# 找到未排序部分中的最小元素min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = j# 将最小元素交换到已排序部分的末尾arr[i], arr[min_idx] = arr[min_idx], arr[i]# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("排序后的列表:", arr)

四、插入排序(Insertion Sort)

插入排序通过将未排序的元素一个个插入到已排序的序列中,从而得到有序序列。

代码实例

def insertion_sort(arr):n = len(arr)for i in range(1, n):key = arr[i]j = i-1# 将大于key的元素向右移动while j >= 0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = key# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("排序后的列表:", arr)

五、快速排序(Quick Sort)

快速排序是一种分而治之的排序算法,通过选择一个基准元素,将列表分为两个子列表,一个包含小于基准的元素,另一个包含大于基准的元素,然后递归地对子列表进行排序。

代码实例

def quick_sort(arr):if len(arr) <= 1:return arrpivot = 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)# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = quick_sort(arr)
print("排序后的列表:", sorted_arr)

六、归并排序(Merge Sort)

归并排序也是一种分而治之的排序算法,它将一个列表分成两个等长(几乎等长)的子列表,递归地对子列表进行排序,然后将排序后的子列表合并成一个有序的列表。

代码实例

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]left_half = merge_sort(left_half)right_half = merge_sort(right_half)return merge(left_half, right_half)def merge(left, right):merged = []left_index = 0right_index = 0# 合并两个已排序的列表while left_index < len(left) and right_index < len(right):if left[left_index] <= right[right_index]:merged.append(left[left_index])left_index += 1else:merged.append(right[right_index])right_index += 1# 将剩余的元素添加到结果列表中while left_index < len(left):merged.append(left[left_index])left_index += 1while right_index < len(right):merged.append(right[right_index])right_index += 1return merged# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = merge_sort(arr)
print("排序后的列表:", sorted_arr)

七、总结

本文介绍了Python中几种常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序,并通过代码实例展示了它们的实现。这些排序算法在不同的情况下各有优缺点,例如冒泡排序和选择排序对于小规模数据是有效的,但对于大规模数据效率较低。快速排序和归并排序在处理大规模数据时表现出色,但快速排序在最坏情况下的时间复杂度为 O ( n 2 ) O(n^2) O(n2),而归并排序的时间复杂度始终为 O ( n l o g n ) O(nlogn) O(nlogn)。了解这些算法的特点和适用场景,可以帮助你根据具体问题选择合适的排序算法。

相关文章:

Python系列(20)—— 排序算法

Python中的排序算法 一、引言 排序算法是计算机科学中的基本算法之一&#xff0c;用于将一组数据按照特定的顺序进行排列。Python提供了多种排序算法的实现&#xff0c;包括内置的排序函数和手动实现的排序算法。本文将介绍几种常见的排序算法&#xff0c;并通过代码实例来展…...

MySQL中json类型的字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…...

算法学习——GCD与欧拉函数

欧几里得GCD&#xff1a; GCD算法是使用辗转相除法求最大公因数的算法&#xff0c;简单而言就是gcd(a,b) gcd(b,a mod b) 递归写法&#xff1a; int Gcd(int a, int b) {if(b 0)return a;return Gcd(b, a % b); } 迭代写法&#xff1a; int Gcd(int a, int b) {while(b …...

40. 组合总和 II(力扣LeetCode)

文章目录 40. 组合总和 II题目描述回溯算法 40. 组合总和 II 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff…...

Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目

文章目录 安装安装JDK安装Maven安装GitNodeJS安装&#xff08;可选&#xff09;安装Jenkins 配置Jenkins为Jenkins更换插件源设置jenkins时区安装插件全局工具配置添加Gitee凭证Gitee项目配置 部署后端1.新建任务2.配置源码管理3.构建触发器4.到Gitee中添加WebHook5.构建环境6.…...

延迟任务基于DeyalQueue

一&#xff0c;延迟任务应用场景&#xff1f; 一般用于处理订单&#xff0c;将redis中的数据延迟存入数据库&#xff0c;实现异步存储减少DB的压力 二&#xff0c; 延迟任务的实现方案有很多 DelayQueue Redisson MQ 时间轮 原理 JDK自带延迟队列&#xff0c;基于阻塞队列…...

Linux 查询端口被占用命令

Linux 查询端口被占用命令 1、lsof -i:端口号 用于查看某一端口的占用情况&#xff0c;比如查看8000端口使用情况&#xff0c;lsof -i:8000 lsof -i:8080&#xff1a;查看8080端口占用 lsof abc.txt&#xff1a;显示开启文件abc.txt的进程 lsof -c abc&#xff1a;显示abc进…...

【c++】string类---标准库中的string类

1. 为什么要学习string类 1.1 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且…...

GO语言学习笔记(与Java的比较学习)(五)

Map 概念 map 是引用类型&#xff0c;可以使用如下声明&#xff1a; var map1 map[keytype]valuetype var map1 map[string]int 在声明的时候不需要知道 map 的长度&#xff0c;map 是可以动态增长的。 未初始化的 map 的值是 nil&#xff08;即零值为nil&#xff09;&…...

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora&#xff0c;一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型&#xff0c;能够依据文字说明&#xff0c;创作出既真实又富有想象力的场景视频&#xff0c;展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析&#xff0c;全面审视了Sor…...

基于springboot实现图书馆管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现图书馆管理系统演示 摘要 电脑的出现是一个时代的进步&#xff0c;不仅仅帮助人们解决了一些数学上的难题&#xff0c;如今电脑的出现&#xff0c;更加方便了人们在工作和生活中对于一些事物的处理。应用的越来越广泛&#xff0c;通过互联网我们可以更方便地…...

MATLAB环境下基于高斯滤波器-广义拉普拉斯算子的细胞核自动检测

作为病理图像分析的基础&#xff0c;细胞核检测可为细胞形态、纹理等多种相关分析提供支持&#xff0c;对于临床诊断具有重要意义。但是细胞核的人工识别过程十分费时费力&#xff0c;并且不同医生之间存在主观标注差异。因此&#xff0c;利用计算机技术进行自动检测能够更为客…...

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架&#xff08;如TensorFlow或PyTorch&#xff09;进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代&#xff0c;当…...

【简说八股】Spring事务失效可能是哪些原因?

Spring事务介绍 Spring事务是指在Spring框架中对数据库操作进行管理的一种机制&#xff0c;它确保一组数据库操作要么完全执行成功&#xff08;提交&#xff09;&#xff0c;要么完全不执行&#xff08;回滚&#xff09;&#xff0c;从而保持数据一致性和完整性。 Spring框架…...

【语音识别】- CTC损失计算的原理

文章目录 1.符号定义与目标函数2.前向计算 α s ( t ) \alpha_s(t) α...

MySQL字符集和比较规则

MySQL字符集和比较规则 字符集和比较规则简介 字符集&#xff1a; 描述字符与二进制数据的映射关系 比较规则&#xff1a;比较指定字符集中的字符的规则 字符集 我们知道&#xff0c;计算机无法直接存储字符串&#xff0c;实际存储的都是二进制数据。字符集是有限的&#xff…...

备忘录模式(Memento Pattern)

定义 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为设计模式&#xff0c;它允许在不破坏封装性的前提下捕获一个对象的内部状态&#xff0c;并在以后将对象恢复到该状态。备忘录模式通常用于实现撤销操作&#xff08;Undo&#xff09;或历史记录&#xff08;H…...

LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机

题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

ORACLE 基础

一.ORACLE简介 1.1什么是oracle ORACLE 数据库系统是美国 ORACLE 公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。…...

Adobe illustrator CEP插件调试

1.创建插件CEP面板&#xff0c;可以参考&#xff1a;http://blog.nullice.com/%E6%8A%80%E6%9C%AF/CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B/%E6%8A%80%E6%9C%AF-CEP-%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8B-Adobe-CEP-%E6%89%A9%E5%B1%95%E5%BC%80%E5%8F%91%E6%95%99%E7%A8%8…...

DLSS Swapper完整指南:3步解锁游戏性能的隐藏潜力

DLSS Swapper完整指南&#xff1a;3步解锁游戏性能的隐藏潜力 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在《赛博朋克2077》中感受过帧率骤降的挫败感&#xff1f;或者看着《控制》中的光线追踪效果&…...

告别图片搜索焦虑:如何在本地硬盘中秒级找到任何相似图片

告别图片搜索焦虑&#xff1a;如何在本地硬盘中秒级找到任何相似图片 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 还在为硬盘里成千上万的图片…...

告别图片混乱!这个.NET工具让你在千万图库中秒级找到相似图片

告别图片混乱&#xff01;这个.NET工具让你在千万图库中秒级找到相似图片 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 你是否曾经面对硬盘里成…...

5分钟掌握NCM解密:网易云音乐文件转换终极指南

5分钟掌握NCM解密&#xff1a;网易云音乐文件转换终极指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样的情况&#xff1a;在网易云音…...

第七史诗自动化助手E7Helper:解放双手的游戏效率革命

第七史诗自动化助手E7Helper&#xff1a;解放双手的游戏效率革命 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签&#x1f343;&#xff0c;挂讨伐、后记、祭坛✌️&#xff0c;挂JJC等&#x1f4db;&#xff0c;多服务器支持&#x1f4fa;&a…...

IGND算法:融合高斯牛顿法与增量学习的优化新范式

1. IGND算法&#xff1a;当高斯牛顿法遇见增量学习在机器学习的世界里&#xff0c;模型训练的本质就是一场持续的优化之旅。我们手握一个由参数构成的复杂函数&#xff0c;目标是在浩瀚的参数空间中&#xff0c;找到那个能让预测误差最小化的“甜蜜点”。多年来&#xff0c;随机…...

卡尔曼滤波调参实战:手把手教你调整Q和R,让Python小车轨迹预测更精准

卡尔曼滤波调参实战&#xff1a;手把手教你调整Q和R&#xff0c;让Python小车轨迹预测更精准在机器人定位和自动驾驶领域&#xff0c;卡尔曼滤波就像一位隐形的导航员&#xff0c;默默修正着传感器传来的嘈杂数据。但这位导航员的工作质量&#xff0c;很大程度上取决于我们为它…...

全同态加密与图机器学习在隐私保护反洗钱中的工程实践

1. 项目概述&#xff1a;当图机器学习遇上全同态加密在金融犯罪&#xff0c;尤其是反洗钱&#xff08;AML&#xff09;的战场上&#xff0c;我们一直面临一个核心矛盾&#xff1a;数据孤岛阻碍了协同作战的效能&#xff0c;而严格的隐私法规&#xff08;如GDPR&#xff09;又像…...

从哈密顿量到李代数:对称性识别与结构常数计算实践

1. 从哈密顿量到李代数&#xff1a;物理学家工具箱里的对称性语言在理论物理和数学物理的日常工作中&#xff0c;我们常常面对一个核心问题&#xff1a;如何从一堆看似复杂的运动方程或一个写出来的哈密顿量中&#xff0c;快速识别出系统隐藏的“灵魂”&#xff1f;这个灵魂&am…...

3D层析SAR与AutoML融合:实现高精度森林树种自动识别

1. 项目概述&#xff1a;当3D雷达“透视”森林&#xff0c;机器学习如何识别每一棵树&#xff1f;在森林资源管理与生态研究中&#xff0c;准确识别树种一直是个既基础又棘手的难题。传统的野外调查方法&#xff0c;依赖人力跋山涉水&#xff0c;不仅成本高昂、效率低下&#x…...