小白也能搞定的Python选择排序

85d162f932fb0dcdca79539ecd950956.jpeg

更多Python学习内容:ipengtao.com

大家好,我是彭涛,今天为大家分享 小白也能搞定的Python选择排序。全文3300字,阅读大约10分钟

选择排序(Selection Sort)是一种简单但有效的排序算法,它通过逐步选择最小(或最大)的元素并将其移动到正确的位置来完成排序。本文将详细介绍如何使用Python实现选择排序算法,以及算法的原理和性能分析。

选择排序算法原理

选择排序的基本思想是遍历待排序的列表,选择最小的元素,并将其与列表的第一个元素交换位置。然后,从剩余的未排序部分中选择下一个最小元素,并将其与列表的第二个元素交换位置,以此类推,直到整个列表排序完成。

Python 选择排序示例代码

下面是一个Python选择排序的示例代码:

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 = jarr[i], arr[min_idx] = arr[min_idx], arr[i]# 示例
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("排序后的数组:", arr)

算法性能分析

选择排序的时间复杂度为O(n^2),其中n是要排序的元素数量。这使得它在大规模数据上的性能相对较差,但在小型数据集上仍然是一个有效的排序算法。由于选择排序是一种不稳定排序算法,在相等元素的顺序可能发生变化时需要格外小心。

优化选择排序

虽然选择排序不够高效,但在某些情况下可以通过优化来提高性能。其中一种优化是减少交换次数,只有在找到最小元素后才进行交换。这可以通过添加额外的条件来实现。

def optimized_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 = jif min_idx != i:arr[i], arr[min_idx] = arr[min_idx], arr[i]# 示例
arr = [64, 25, 12, 22, 11]
optimized_selection_sort(arr)
print("排序后的数组:", arr)

选择排序的应用场景

虽然选择排序在大规模数据集上性能较差,但在某些特定场景下仍然非常有用。例如,当排序过程中需要最小化交换次数时,选择排序可以是一种较好的选择。它的主要优点是简单易懂,代码相对短小,适用于小型数据集的排序需求。

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 = jarr[i], arr[min_idx] = arr[min_idx], arr[i]# 示例
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("排序后的数组:", arr)

选择排序的稳定性

选择排序是一种不稳定排序算法,这意味着当存在相等元素时,它们的顺序可能会发生变化。如果需要保持相等元素的相对顺序,选择排序可能不是最佳选择。

def unstable_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 = jarr[i], arr[min_idx] = arr[min_idx], arr[i]# 示例
arr = [(3, 'apple'), (2, 'banana'), (3, 'cherry'), (1, 'date')]
unstable_selection_sort(arr)
print("排序后的数组:", arr)

选择排序与其他排序算法的比较

选择排序的主要优点是实现简单,代码容易理解。然而,它的时间复杂度相对较高,因此在大规模数据集上不如其他高级排序算法(如快速排序或归并排序)高效。因此,对于大型数据集,更高效的排序算法通常更为适用。

# 比较选择排序和快速排序性能
import random
import timedef 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 = [random.randint(0, 10000) for _ in range(1000)]start_time = time.time()
selection_sort(arr.copy())
print("选择排序耗时:", time.time() - start_time, "秒")start_time = time.time()
quick_sort(arr.copy())
print("快速排序耗时:", time.time() - start_time, "秒")

选择排序的时间复杂度分析

选择排序的时间复杂度是O(n^2),其中n是要排序的元素数量。由于双重循环,它在大规模数据集上的性能相对较差。因此,对于大型数据集,更高效的排序算法通常更为适用。

当然,以下是选择排序的时间复杂度分析的示例代码:

def selection_sort(arr):comparisons = 0swaps = 0n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):comparisons += 1if arr[j] < arr[min_idx]:min_idx = jswaps += 1arr[i], arr[min_idx] = arr[min_idx], arr[i]return comparisons, swaps# 示例
arr = [64, 25, 12, 22, 11]
comparisons, swaps = selection_sort(arr)
print("排序后的数组:", arr)
print("比较次数:", comparisons)
print("交换次数:", swaps)

在示例代码中,添加了计数器来追踪比较次数和交换次数,以便更好地理解选择排序的性能分析。

总结

选择排序是一种简单但不够高效的排序算法,它通过逐步选择最小元素并将其放置在正确位置来完成排序。本文详细介绍了选择排序的工作原理,并提供了示例代码和时间复杂度分析。

选择排序的时间复杂度为O(n^2),其中n是要排序的元素数量。这使得它在大规模数据集上的性能相对较差,但在小型数据集上仍然是一个有效的排序算法。选择排序的主要优点是实现简单,代码容易理解,适用于教育和理解排序算法的基本概念。

然而,选择排序的性能劣势在于它的比较和交换次数与数据的初始顺序无关。这导致了在最好情况下(已经有序的情况下)也需要执行相同数量的操作,性能浪费明显。为了更高效地排序大规模数据集,通常会选择其他排序算法,如快速排序或归并排序,它们具有更好的平均时间复杂度和更稳定的性能。

综上所述,选择排序是一个有助于理解排序算法基本原理的良好起点,但在实际应用中,尤其是对大规模数据的排序需求,通常会优先考虑更高效的排序算法。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

31f26e80220b6a91ad49ad076b1c5c32.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

掌握函数式组件:迈向现代化前端开发的关键步骤(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

数据孤岛:一场数据的独立战争

在当今数字化的时代&#xff0c;数据已成为企业和组织最宝贵的资产之一。然而&#xff0c;尽管数据的价值被广泛认可&#xff0c;但数据的分散和孤立问题却仍然存在&#xff0c;这就是所谓的数据孤岛。本文将重点分析什么是数据孤岛、数据孤岛的危害以及解决数据孤岛的传统和创…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器&#xff0c;强悍的性能远超苹果的iTunes&#xff0c;iMazing 能让广大果粉能已自己的方式管理苹果设备&#xff0c;无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

在使用 npm install的时候提示node-sass command faile 解决方案

在使用npm install的时候错误提示node-sass 相关的。错误信息如下图&#xff1a; 解决方法&#xff08;PS&#xff1a;凯哥的不适用&#xff09; 出现这种问题基本是由于node版本与sass版本不匹配导致的 方案1&#xff1a;卸载node&#xff0c;安装对应版本 方案2&#xff1…

2023最新轻松升级、安装和试用Navicat Premium 16.3.3 教程详解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Java进阶九—数组问题(集合框架)

Java进阶九—数组问题(集合框架) 一.原生数组带来的问题 原生数组容易造成超出边界&#xff0c;如果非要使用传统的数组&#xff0c;增删改查&#xff0c;就要用到数据结构&#xff0c;非常复杂CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(…

Mac如何配置Java环境

想必很多小伙伴会遇到配置Java环境的情况&#xff0c;今天就跟大家一起分享下我的安装过程&#xff0c;记录一下也是留给需要的小伙伴学习 一、下载和安装JDK 登录OracleJDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;或者OpenJDK官网…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂&#xff0c;升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段&#xff0c;并详细探讨IP地址过滤的策略&#xff0c;以提升网络的安全性。 第一部分&#xff1a;反网络爬虫的三…

射频芯片CMT2310-DEMO 通信覆盖测试体验

CMT2310是一款超低功耗,高性能的射频收发器,申请一套原厂CMT2310演示demo来验证下Sub-868设备在国内城市环境通信覆盖效果。 城市道路实测情况 测试小结&#xff1a;设备已基于外置天线&#xff0c;且以最佳方位做验证&#xff0c;但测试结果数据不是很理想。

Vue3 性能优化

代码分析 由于我们使用的是vite vite打包是基于rollup 的我们可以使用 rollup 的插件 npm install rollup-plugin-visualizervite.config.ts 配置 记得设置open 不然无效 import { visualizer } from rollup-plugin-visualizer; plugins: [vue(), vueJsx(),visualizer({open:…

【PS】制作 素描 + 遗照

复制一个图层 图像-调整-黑白 图片变成黑白图片&#xff08;好像遗照啊&#xff09; 新建一个图层&#xff0c;按住ATLDETELED 填充图层颜色为白色 &#xff08;设置一下颜色&#xff09; 设置混合模式为&#xff1a;颜色减淡 设置前景色为黑色。 选择毛笔工具&#xff0c;在…

贝叶斯球快速检验条件独立

贝叶斯球 定义几个术语&#xff0c;描述贝叶斯球在一个结点上的动作&#xff1a; 通过&#xff08;pass through&#xff09;&#xff1a;从当前结点的父结点方向过来的球&#xff0c;可以访问当前结点的任意子结点&#xff08;父->子&#xff09;。从当前节点的子结点方向…

格雷编码(转换与计算)附代码

目录 格雷码对应表 格雷码转换公式 公式1 公式2 代码实现 格雷码对应表 十进制数 4位自然二进制码 4位典型格雷码 0 0000 0000 1 0001 0001 2 0010 0011 3 0011 0010 4 0100 0110 5 0101 0111 6 0110 0101 7 0111 0100 8 1000 1100 9 1001…

十五、W5100S/W5500+RP2040之MicroPython开发<Modbus示例>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 指令构成2.3 优点2.4 应用 3. WIZnet以太网芯片4. Modbus TCP通信示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;Micr…

C语言-第十六周做题总结

id:374 A.求最大值及其下标 题目描述 本题要求编写程序&#xff0c;找出给定的n个数中的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。 输入 输入在第一行中给出一个正整数n&#xff08;1<n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开…

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

【Linux系统基础】(4)在Linux上部署Tomcat、Nginx软件

Tomcat安装部署【简单】 简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个W…

锐捷ssh配置

配置实例 ssh-Server ssh-Server(config)#enable service ssh-server // 启用ssh服务 ssh-Server(config)#username admin privilege 15 password Test123456 // 设置ssh登陆的账户密码 ssh-Server(config)#line vty 0 4 ssh-Server(config-line)#transport input ssh …

线性回归简介

线性回归简介 1、情景描述2、线性回归 1、情景描述 假设&#xff0c;我们现在有这么一张图&#xff1a; 其中&#xff0c;横坐标x表示房子的面积&#xff0c;纵坐标y表示房价。我们猜想x与y之间存在线性关系&#xff1a; y k x b ykxb ykxb 现在&#xff0c;思考一个问题&…