小白也能搞定的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.hqwc.cn/news/297004.html

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

相关文章

IW5500手提式强光巡检工作灯

适用场所&#xff1a; 适用于铁路列检作业、工务巡道、车辆检修&#xff1b; 适用于冶金、厂电、网电等行业的巡查、设备检修等。 产品特点&#xff1a; 工作光、强光两种光设计&#xff0c;按动按钮可进行自由转换。 工作时间长&#xff0c;强光和工作光的连续工作时间分别在…

c++代码寻找USB00端口并添加打印机

USB00*端口的背景 插入USB端口的打印机&#xff0c;安装打印机驱动&#xff0c;在控制面板设备与打印机处的打印机对象上右击&#xff0c;可以看到打印机端口。对于不少型号&#xff0c;这个端口是USB001或USB002之类的。 经观察&#xff0c;这些USB00*端口并不是打印机驱动所…

制作自己的 Docker 容器

软件开发最大的麻烦事之一&#xff0c;就是环境配置。用户必须保证操作系统的设置&#xff0c;各种库和组件的安装&#xff0c;只有它们都正确&#xff0c;软件才能运行。docker从根本上解决问题&#xff0c;软件安装的时候&#xff0c;把原始环境一模一样地复制过来。 以 koa-…

为什么c++的开源库那么少?

为什么c的开源库那么少&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;…

【JavaWeb学习笔记】15 - jQuery

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jquery 目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 …

C# 实现虚拟数字人

随着Ai技术的提升和应用&#xff0c;虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小&#xff0c;可以让数字人可以在电脑屏幕各个位置显示&#xff1a; 虚拟数字人素材&#xff1a; 虚拟数字人(实际有语音&am…

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

零基础学人工智能:TensorFlow 入门例子

识别手写图片 因为这个例子是 TensorFlow 官方的例子&#xff0c;不会说的太详细&#xff0c;会加入了一点个人的理解&#xff0c;因为TensorFlow提供了各种工具和库&#xff0c;帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量&#xff08;Tenso…

基于Java SSM框架实现学生综合考评作业成绩管理系统项目【项目源码+论文说明】

基于java的SSM框架实现学生综合考评作业成绩管理系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 学生综合考评管理系统&#xff0c;主要的模块包括查看&#xff1b;管理员&#xff1…

互联网上门洗衣洗鞋小程序优势有哪些?

互联网洗鞋店小程序相较于传统洗鞋方式&#xff0c;具有以下优势&#xff1b; 1. 便捷性&#xff1a;用户只需通过手机即可随时随地下单并查询&#xff0c;省去了许多不必要的时间和精力。学生们无需走出宿舍或校园&#xff0c;就能轻松预约洗鞋并取件。 2. 精准定位&#xff1…

第26关 K8s日志收集揭秘:利用Log-pilot收集POD内业务日志文件

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 OK&#xff0c;到目前为止&#xff0c;我们的服务顺利容器化并上了K8s&#xff0c;同时也能通过外部网络进行请求访问&#xff0c;相关的服务数据也能进行持久化存储了&#xff0c;那么接下来…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端&#xff0c;可以私有化部署: etcd-workbench 开源地址&#xff1a;https://github.com/tzfun/etcd-workbench Gitee地址&#xff1a;https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…