使用python循环完成对列表的选择排序_Python中选择排序Selection Sort-程序员宅基地

技术标签: 使用python循环完成对列表的选择排序  

介绍

排序虽然是一项基本操作,但却是计算机应执行的最重要的操作之一。它是许多其他算法和过程(例如搜索和合并)的基础。了解不同的排序算法可以帮助您更好地理解不同算法背后的思想,并帮助您提出更好的算法。

在选择排序算法排序通过找到未排序部分的最小值,然后与所述第一未排序的元件交换它的阵列。它是就地算法,这意味着您不需要分配其他列表。尽管速度很慢,但在内存有限的系统中,它仍被用作主要的排序算法。

在本文中,我们将解释选择排序的工作原理并在Python中实现它。然后,我们将分解算法的动作,以了解其时间复杂度。

选择排序

那么选择排序如何工作?选择排序将输入列表分为两部分,已排序的部分最初为空,未排序的部分最初包含所有元素的列表。该算法然后选择所有未排序文件的最小值,并将其与第一个未排序值交换,然后将排序部分增加一个。

此类的高级实现如下所示:

在上面的伪代码中,argmin()是一个返回最小值索引的函数。该算法使用变量i来跟踪已排序列表的结束位置和未排序列表的开始位置。由于我们从没有排序的项目开始并取最小值,因此,总是存在未排序部分的每个成员大于已排序部分的任何成员的情况。

第一行增加的值i,第二行找到最小值的索引,第三行交换这些值。交换之所以有效,是因为Python在将任何内容分配给左侧之前先计算了右侧,因此我们不需要任何临时变量。

让我们来看看它是如何工作的行动,包含以下元素的列表:[3, 5, 1, 2, 4]。

我们从未排序的列表开始:

3 5 1 2 4

未排序的部分包含所有元素。我们仔细检查每个项目,并确定这1是最小的元素。所以,我们换1用3:

15 3 2 4

在其余未排序的元素中[5, 3, 2, 4],2是最低的数字。现在2,我们交换5:

1 23 5 4

此过程将继续进行,直到对列表进行排序:

1 2 35 4

1 2 3 45

1 2 3 4 5

让我们看看如何在Python中实现它!

实现

实现此算法的技巧是跟踪最小值并交换列表的两个元素。sort.py在您最喜欢的编辑器中打开一个名为的文件,然后在其中输入以下代码:

现在,将一些代码添加到文件中以测试算法:

然后,您可以打开一个终端并运行以查看结果:

该列表已正确排序!我们知道它是如何工作的,并且可以在Python中实现选择排序。让我们进入一些理论,看看它在时间方面的表现。

时间复杂度计算

那么,选择排序对列表进行排序需要多长时间?给定一个size数组,我们将采用一种方法并精确计算选择排序算法所花费的时间n。代码的第一行是:

这行不应该花费太多,因为它只是设置函数堆栈。我们说这是一个常数-输入的大小不会改变此代码运行的时间。假设c1执行此行代码需要执行操作。接下来,我们有:

这个有点棘手。首先,我们有两个函数调用len()和range(),它们在for循环开始之前执行。len()CPython 的成本也与CPython的大小无关,CPython是Windows,Linux和Mac上的默认Python实现。的初始化也是如此range()。让我们把这两个叫做c2。

接下来,我们有for,即运行n - 1时间。这不是一个常数,输入的大小确实会影响执行的时间。因此,我们必须将完成一个循环所需的时间乘以n - 1。

可以in说,评估运营商的成本是恒定的c3。这涵盖了外部for循环。

变量分配也可以在恒定时间内完成。我们称这个为c4:

现在,我们遇到内部for循环。它具有两个常量函数调用。假设他们采取c5行动。

请注意,c5它与有所不同c2,因为range这里有两个参数,并且这里要执行加法运算。

到目前为止,我们已经有了c1 + c2 + (n - 1) * (c3 + c4 + c5)操作,然后我们的内循环开始,将所有内容乘以…?好吧,这很棘手,但是如果仔细观察,它会n - 2在第一个循环中花费时间,n - 3在第二个循环中花费时间,最后一次则花费1。

我们需要将所有内容乘以1到之间的所有数字的总和n - 2。数学家告诉我们,总和为(n - 2) * (n - 1) / 2。随时x在这里阅读有关1和任何正数之间的整数之和的更多信息。

内循环的内容也将在固定时间内完成。让我们把它需要的Python做的时候in,if,赋值语句和变量交换占用的任意固定时间c6。

大家一起得到c1 + c2 + (n - 1) * (c3 + c4 + c5) + (n - 2) * (n - 3) * c6 / 2。

我们可以简化这个到:a * n * n + b * n + c,其中a,b和c代表评估常量的值。

这称为O(n2)。那是什么意思?总而言之,我们算法的性能基于输入列表的平方大小。因此,如果我们将列表大小加倍,则将其排序所需的时间将乘以4!如果我们将输入的大小除以3,则时间将减少9!

结论

在本文中,我们研究了选择排序的工作原理并在Python中实现了它。然后,我们逐行分解代码以分析算法的时间复杂度。

0

相关文章:Python中的语句、缩进和注释 语句 用源代码编写的用于执行的指令称为语句。Python编程语言中有不同类型的语句,例如Assignment语 […]...

在C / C++,Python,PHP和Java中交换两个变量 如何在不使用库函数的情况下交换两个变量? Python:在Python中,有一个简单且语法简洁的结构来交换变量 […]...

Python中的生成器Generator 先决条件: 迭代器 我们讨论生成器时涉及两个术语。 Generator-Function: generator […]...

使用Python中的元类进行元编程 元编程看起来很时髦,但如果你曾经合作过的装饰器或元类,你其实做过元编程。简而言之,我们可以说元编程是操纵代码的 […]...

使用Python进行鼠标和键盘自动化 本文说明了如何使用Python中的pyautogui模块自动执行鼠标和键盘的移动。该模块未预装Python。因 […]...

用Python导入模块 Python中的导入类似于C/C++中的#include header_file。通过使用import导入文件 […]...

Numpy中的N维数组 ndarray Numpy中的N维数组(ndarray) Numpy中的Array是元素表(通常是数字),所有元素都是相同类型 […]...

线性回归(Python实现) 本文讨论了线性回归的基础知识及其在Python编程语言中的实现。 线性回归是一种统计方法,用于对因变量与给定的 […]...

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35733586/article/details/113692489

智能推荐

【深度学习】归一化_深度学习 那些情况 要做 归一化-程序员宅基地

文章浏览阅读1.8w次,点赞8次,收藏11次。​ 以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过 $ \sigma(WX+b) $ 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。​ 这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。_深度学习 那些情况 要做 归一化

微信小程序支付接口实现(java后台)_小程序后台java支付接口-程序员宅基地

文章浏览阅读1.2w次,点赞12次,收藏101次。#(Notice:以下所有经验也是我根据网上的经验整理的,如有侵权可以联系我删除,QQ 654303408。 有问题讨论也可联系我,QQ同上。)#(Tips:我是第一次开发,一个刚毕业的java工程师,我觉得我并非天赋异禀,我能学会,相信聪敏的你,一定可以)#(PS:目前微信拥有无可撼动的人口基数,越来越多的项目开发是基于微信小程序,或者APP。但是支付方式无非两种,一种是支付宝,一种是微信支..._小程序后台java支付接口

python web server_用Python建立最简单的web服务器-程序员宅基地

文章浏览阅读27次。第一个python Web程序——简单的Web服务器。与其它Web后端语言不同,Python语言需要自己编写Web服务器。如果你使用一些现有的框架的话,可以省略这一步;如果你使用Python CGI编程的话,也可以省略这一步;用Python建立最简单的web服务器利用Python自带的包可以建立简单的web服务器。在DOS里cd到准备做服务器根目录的路径下,输入命令:python -m Web服务..._pyjwt webserver

【图像重建指标 Metrics】均方误差RMSE及平均绝对误差MAE的定义和区别_rmse与mae有换算公式吗-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏23次。RMSE和MAE能很好的反应图像的重建结果与真实结果间的差异。_rmse与mae有换算公式吗

Kotlin Gradle Junit单元测试print输出控制台_gradle 打印日志 system. out.print-程序员宅基地

文章浏览阅读3.4k次。背景默认情况下,Gradle 单元测试,是无法使用 System.out.println 这样打印变量信息的,这会让我们debug变得非常麻烦。百度网上很多方案,,但都比较麻烦,也很容易踩坑,。换了个搜索姿势,google了下,原来方案如此简单。解决在你的模块下的build.gradle.kts添加如下的配置:tasks.withType<Test> { this.testLogging { this.showStandardStreams = true _gradle 打印日志 system. out.print

Android基本组件之服务Service_安卓如果设置组服务-程序员宅基地

文章浏览阅读167次。Service的开启与关闭1.继承Service类2.在AndroidManifest.xml中注册<service android:name=".MyService" android:enabled="true" android:exported="true"></service>直接创建Service的话,前两步会自动执行3.通过Contex.startSer..._安卓如果设置组服务

随便推点

sqlmap的使用--绕过--自带脚本tamper_sqlmap绕过脚本-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏11次。sqlmap在默认的的情况下除了使用char()函数防止出现单引号,没有对注入的数据进行修改,还可以使用–tamper参数对数据做修改来绕过waf等设备。命令格式:sqlmap -u [url] --tamper [模块名]通过使用whereis sqlmap查看sqlmap安装路径,自带的脚本一般是在usr/share/sqlmap/tamper下,我的是1.6.3版本一共有66个自带脚本下边引一些常用的脚本:apostrophemask.py适用数据库:ALL作用_sqlmap绕过脚本

换行分隔符_分隔符 换行-程序员宅基地

文章浏览阅读1.7k次。windows:\r\nlinux:\rmac:\n_分隔符 换行

waves效果器_混音选择困难2,Waves均衡器全介绍与理论使用心得-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏8次。喜欢「音乐杂谈」这个主题的朋友可以关注我的头条号,将会在不定期发表一些音乐理论以外的音乐话题的文章或者是音乐知识的干货 。(此文为混音师天职老师 发布于今日头条的原创文章,转载请告知并注明出处)通篇写作整理下来差不多花了7个小时,不管怎样,施舍点个赞吧。哈哈哈!继上一次「音乐杂谈41」混音选择困难第一期,给大家介绍了Waves全家桶的大部分压缩器之后,本篇,我们将来看看,Waves全家桶的大部分均..._waves功能详解

在Android中播放音频和视频_android 播放语言视频-程序员宅基地

文章浏览阅读2.8k次。Android媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。本文简介媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。范围:_android 播放语言视频

Sublime and Markdown-程序员宅基地

文章浏览阅读2.7k次。Sublime & Markdown文章目录Sublime & Markdown安装 Sublime设置 Sublime安装插件Package ControlMarkdownEditingMarkdown PreviewLiveReloadauto-saveOmniMarkupPreviewerEvernote插件&主题插入图片Ctrl+vHTML语法Markdown语法...

android uboot log,RK3288 Android 8.1系统uboot logo过渡到kernel logo会花一下-程序员宅基地

文章浏览阅读695次。在调试RK3288 Android 8.1系统遇到一个问题:开机启动uboot logo过渡到kernel log的过程中会花掉直到没有显示,再出现kernel logo。分析:打印串口log时发现,uboot阶段显示一切正常,进入kernel以后就开始花掉了然后变成没有显示了,感觉像是慢慢掉电了一样,再继续查看log发现如下打印:[ 0.363167] Registered fiq deb..._mtk 转屏后 logo uboot 转kernel 显示异常

推荐文章

热门文章

相关标签