python 选择排序算法

选择排序原理与Python实现:从零掌握基础排序算法 排序算法是数据结构与算法学习的基础,理解其底层逻辑对编程能力提升至关重要。选择排序作为最直观的排序算法之一,每一轮从未排序区间选出最小值并交换到正确位置,通过两层循环即可实现。虽然其时间复杂度为O(n²),但交换次数少、空间占用O(1),在特定场景仍有价值。通过Python代码实现,可深入理解索引边界、稳定性及性能取舍,也为学习堆排序、快速排序等高级算法奠定基础。本文从原理到调试技巧,完整展示选择排序的工程实践。 阅读详情
AI摘要

本文详细介绍了选择排序算法的基本原理,包括其工作流程、与冒泡排序的区别、Python代码实现及复杂度分析。通过本文,读者可以深入理解选择排序的运作机制及其应用场景。

一、选择排序(selection sort)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,所以称为:选择排序。

二、选择排序原理

  1. 设第一个元素为比较元素,依次和后面的元素比较,比较完所有元素并找到最小元素,记录最小元素下标,和第0个下表元素进行交换。
  2. 在未排序区域中,重复上述操作,以此类推找出剩余最小元素将它换到前面,即完成排序。

三、选择排序和冒泡排序对比

选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。

只不过,冒泡排序是将每轮找出的最值放到最右边,而选择排序是将每轮找出的最值放到最左边。并且在算法上,冒泡排序是将相邻的数进行逐个比较,以从小到大排序为例,只要前面的比后面的大,就互换这两个数,直到最后将最大的数“浮”到最右边,如此依次循环。而选择排序是先保存第一个元素的下标,然后后面所有的数依次与第一个元素相比,如果遇到更小的,则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后将最小的数的下标找出来,然后再将这个数放到最左边,即与下标为 0 的数互换。如果最小的数的下标就是 0 那么就不用互换。

所以,选择排序算法是先判断最小的数的下标是不是 0,如果不是则说明最小的数不是第一个元素,则将这个数与第一个元素互换位置,这样一轮下来最小的那个数就被找到并放到了最左边。

在第二轮同样先保存新序列第二个元素的下标,后面所有的数依次与第二个元素相比较,如果遇到更小的则记录更小的那个数的下标,然后后面所有的数都依次与那个更小的数比较,直到最后又找到一个最小的,此时这个最小的在整个序列中是“第二小”。然后再判断这个数的下标是否等于 1,如果不等于 1 说明“第二小”的那个数不是第二个元素,则将这个数与第二个元素互换位置,这样第二轮下来就找到了“第二小”的那个数,并将它放到了第二个位置。如此循环,直到整个序列实现从小到大排序。

如果是从大到小排序,那么就记录大的那个数的下标,每一轮找出一个最大的数放到左边。

从上面的分析可以看出,选择排序和冒泡排序的另一个不同点是,冒泡排序只要遇到前面比后面大的就互换,而选择排序是比较一轮才互换一次,而且如果本轮中最小的就是最左边那个数则不用互换。所以从这个角度看,选择排序比冒泡排序的效率要高。而且通过上面对选择排序的分析发现,从逻辑上讲,与冒泡排序相比,选择排序更符合人的思维。

四、选择排序流程图

在这里插入图片描述

五、选择排序的代码实现(python)

def selection_sort(num_list):
    length = len(num_list)
    if length <= 1:
        return num_list

    for j in range(length):
        # 假设第一个元素为最小元素
        min_num_index = j
        
        # 遍历未排序区域元素,以此和未排序区域的第一个元素做对比
        for i in range(j+1, length):
            if num_list[i] < num_list[min_num_index]:
                min_num_index = i
         
        # 交换位置
        num_list[min_num_index], num_list[j] = num_list[j], num_list[min_num_index]

    return num_list


if __name__ == '__main__':
    a = [1, 3, 2, 6, 4, 12, 33, 5, 25]
    print(selection_sort(a))

六、时间复杂度和空间复杂度

空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1)

时间复杂度:我们看到选择排序同样是双层循环n*(n-1)),所以时间复杂度也为:O(n^2)

稳定性:因为存在任意位置的两个元素交换,比如[5, 8, 5, 2],第一个5会和2交换位置,所以改变了两个5原来的相对顺序,所以为不稳定排序。

是否为原地排序: 是原地排序

chatgpt赋能python:Python选择排序算法图解 本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。 阅读详情

相关推荐

Python中排序算法之选择排序

接下来在绿框中的数列中找出其最小值“5”,然后把“5”放到红框数列的尾部,如图3所示。图3 第二次排序之后继续在绿框的数列中查找最小值,放到红框数列的尾部,最终红框数列即为得到的升序数列,如图4所示。图4 接下来的排序。

hou09tian的博客 1175

python选择排序法详解_选择排序算法,C语言选择排序算法详解

选择排序算法,C语言选择排序算法详解选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。只不过,冒泡排序是将每轮找出的最值放到最右边,而选择排序是将每轮找出的最值放到最左边。并且在算法上,冒泡排序是将相邻的数进行逐个比较,以从小到大排序为例,只要前面的比后面的大,就互换这两个数,直到最后将最大的数“浮”到最右边,如此...

weixin_39955825的博客 603

Python | 选择排序之简单选择排序

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。引言一听到选择排序的词第一反应都是要通过选择来排序,那么我们的第一反应是不是对的呢,我们接下来验...

算法与编程之美 759

python实现选择排序

基本思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,则经过n-1趟排序可以使得整个排序表有序。空间效率:仅使用常数个辅助单元,因此空间效率为O(1)时间效率:O(n²)它是一个不稳定的排序算法。堆排序是一种树形选择排序方法,在排序过程中,将L[1…n]看作一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。

liulanba的博客 3万+

Python实现选择排序算法

该函数通过两层循环完成排序过程,外层循环遍历列表元素,内层循环从当前元素后面的所有元素中选出最小值,然后将其与当前元素交换。选择排序算法是一种简单直观的排序算法,其基本思想是在未排序序列中找到最小(大)元素,放到已排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。第6行:判断当前元素右侧是否存在比其更小的元素,如果有,将min_idx更新为更小元素的下标。第3行:通过外层循环遍历列表arr中的每个元素。第5行:通过内层循环遍历当前元素后面的所有元素。

持续更新 221

用Python编写选择排序算法

选择排序是一种简单但效率较低的排序算法,它的思想是从待排序的数据中选择最小(或最大)的元素放到已排序的序列的末尾,直到所有元素都排序完成。如果我们找到了一个更小的值,就将min_idx更新为当前值的索引,然后继续处理相邻的元素。首先,我们用一个循环遍历整个列表,找到未排序部分的最小值,并将其与未排序部分的第一个元素交换位置。在这个例子中,我们生成了包含10个随机整数的数组,并打印出原始数组和排序后的数组。总之,选择排序算法是Python中实现简单但效率较低的排序算法之一。用Python编写选择排序算法。

m0_47037246的博客 324

Python 实现选择排序算法

选择排序(selection sort): 选择排序算法如下: 首先在未排序序列中找到最小(大)元素, 存放到排序序列的起始位置 然后再从剩余未排序元素中继续寻找最小(大)元素,放到已排序列的末尾 以此类推 其时间复杂度: ​​​​​​​最优时间复杂度: O(n²) 最坏时间复杂度: O(n²) 选择排序稳定性: 不稳定( 考虑升序每次选择最大的情况 ) 代码实...

Nick.Peng's Blogs 1942

深入解析UVM寄存器模型:reg2bus与bus2reg的隐式调用机制

本文深入解析了UVM寄存器模型中reg2bus与bus2reg函数的隐式调用机制。通过追踪一次寄存器访问的完整旅程,揭示了这两个关键函数是如何在uvm_reg_map和uvm_reg_predictor中被框架自动调用的,从而在抽象的寄存器操作与具体总线事务之间完成转换,并实现镜像值的自动更新。掌握此机制是高效调试和灵活应用UVM寄存器模型的基础。

weixin_29211309的博客 441

选择排序算法 python实现

选择排序算法 python实现 通过两个函数,实现选择排序算法,将无序的列表改变为有序的列表

m0_51395584的博客 587

HFSS简要教程--无线能量传输线圈仿真

关于无限能量传输线圈仿真简要教程

asdmoon18的博客 2547

如何使用obspy下载地震波形数据

如果你是地震研究学者,或者需要进行地震方面的研究,那么地震数据下载是一个必不可少的流程,本文将告诉你如何使用obspy下载想要的地震数据

monsterk1的博客 2077

python实现选择排序算法

前面我们讲解了选择排序算法,现在我们使用python代码来实现 #!/usr/bin/python # -*- coding: utf-8 -*- #选择排序 def select_sort(the_list): i = 0 while i &lt; len(the_list): j = i+1 while j &lt; len(the_lis...

美丽的泡沫 2141

如果使用ssms连接SQLserver的时候出现无法连接到服务器。

如果使用ssms连接SQLserver的时候出现无法连接到服务器。 Lan 2020-03-29 22:11 329 人阅读 0 条评论 标题: 连接到服务器------------------------------无法连接到...

Vastsa的博客 1万+

Python选择排序算法(二)

接上篇选择排序算法,使用不同的思路展示,第一次尝试用的是记录最小值,变换位置,本次尝试用的是记录最小值的位置,转换值 Python代码如下 #! coding:utf8 import random def select_sort(arr): for i in range(len(arr) - 1): min_position = i for j i...

普天&同庆 5927

基于 FPGA Vivado 信号发生器设计(附源工程)

今天给大侠带来基于 FPGA Vivado 信号发生器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于 FPGA Vivado 信号发生器设计(附源工程),掌握基于添加文件和IP的Vivado工程设计流程,掌握基于Tcl的Vivado工程设计流程,学习信号发生器的基本组成结构。获取本篇相关源工程代码,可在公众号内回复“信号发生器设计源工程”。 设计原理 信号发生器...

7990

《YOLOv8:从入门到实战》专栏介绍 & 专栏目录

本专栏涵盖了丰富的YOLOv8算法从入门到实战系列教程,专为学习YOLOv8的同学而设计,堪称全网最详细的教程!🌈🌈🌈

小哥谈 6489

python学习——python实现选择排序算法

python实现选择排序算法一、选择排序算法实现原理基本思想具体步骤二、图解选择排序三、py代码实现选择排序算法 一、选择排序算法实现原理 基本思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 具体步骤 从第一个数开始计数基准(为最小值),记录下标 循环比较后面的数,记录比基准小的数的下标,直到最后一个数比较后,将当前最小值下标与基准替换 从下标为第几次循环开始继续

mataodehtml的博客 1131

WPF用户控件间属性传递的艺术

本文详细介绍了WPF中父控件向子控件传递属性的方法。针对常见的绑定失效问题,重点讲解了使用RelativeSource绑定技术,通过指定AncestorType确保正确访问父控件属性。文章通过实例演示了从ParentModel传递属性到ChildUserControl依赖属性的完整实现过程,包括模型定义、XAML结构设计和代码实现。这种方法有效解决了数据上下文混淆问题,为WPF开发中的控件交互提供了可靠解决方案,有助于提升应用的灵活性和可维护性。

2501_90323865的博客 56

Python选择排序算法

Num01–>选择排序定义 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

IT晓可程序员之路 6939

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 291

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

python排序算法——选择排序

(附详细代码)选择排序的平均时间复杂度是O(n2),最好情况下的时间复杂度和最坏情况下的时间复杂度都是O( n2 )。另外,它是一个不稳定的排序算法。选择排序的过程很容易理解。

阿极的博客 619

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python选择排序算法_Python实现的选择排序算法原理与用法实例分析

本文实例讲述了Python实现的选择排序算法。分享给大家供大家参考,具体如下:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的...

weixin_39749501的博客 165

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用python实现选择排序_Python实现的选择排序算法示例

本文实例讲述了Python实现的选择排序算法。分享给大家供大家参考,具体如下:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序每次只记录最大数的索引值. 类似于冒泡排序, 也是要比较n-1次, 区别是冒泡排序每次都交换, 选择排序只在最后比较完后才进行...

weixin_39756481的博客 297

python 实现选择排序算法

**选择排序**python实现 选择排序算法新的开始python 代码实现小结 python实现 选择排序算法 新的开始 最近又重新翻看了算法的书,本科的时候学习算法完全是为了应付考试,当时书上的算法都是伪代码,有的是用C写的代码。现在重新翻看算法,尝试着用python来实现这些代码。 python 代码实现 // 选择排序算法 # 首先定义一个找出数组中最小元素的函数 def SearchSm...

虫子的博客 901

python实现排序算法——选择排序

       使用python实现选择排序算法。 算法步骤: Step 1: 选择目前尚未排序的序列的首位序号,将其依次和后面的数字比较,选出后面序列的最小序号,并将最小序号和之前记录的首位序号调换位置。这样可以将最小的数字排在最前面 Step 2: 将step 1循环执行(n−1)(n-1)(n−1)次, 不断的选择当前未排序的序列的最小值,放在当前为排...

海军上将光之翼的博客 987
上一篇: python 插入排序算法
下一篇: python 归并排序(详解)
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶知秋的BLOG

创作不易 请多多关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值