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

news2025/1/14 18:32:02

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 = i
        for 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, 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 = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        if 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 = i
        for 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, 25, 12, 22, 11]
selection_sort(arr)
print("排序后的数组:", arr)

选择排序的稳定性

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

def unstable_selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for 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 = [(3, 'apple'), (2, 'banana'), (3, 'cherry'), (1, 'date')]
unstable_selection_sort(arr)
print("排序后的数组:", arr)

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

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

# 比较选择排序和快速排序性能
import random
import time

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = 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 = 0
    swaps = 0
    n = len(arr)
    
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            comparisons += 1
            if arr[j] < arr[min_idx]:
                min_idx = j
        
        swaps += 1
        arr[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.coloradmin.cn/o/1331961.html

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

相关文章

正则表达式与bs4选择器筛选论文数准确率之比较

一、正则爬取论文网首页论文标题的示例 import requests import re from bs4 import BeautifulSoupheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36}def get_html(url):try:res…

Hadoop入门学习笔记——二、在虚拟机里部署HDFS集群

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 二、在虚拟机里部署HDFS集群2.1. 部署node1虚拟机2.2. 部…

Vue如何请求接口——axios请求

1、安装axios 在cmd或powershell打开文件后&#xff0c;输入下面的命令 npm install axios 可在项目框架中的package.json中查看是否&#xff1a; 二、引用axios import axios from axios 在需要使用的页面中引用 三、get方式使用 get请求使用params传参,本文只列举常用参数…

基于 Sentry 的前端监控系统搭建(Linux)

一、前言 随着技术这几年的发展与沉淀&#xff0c;线上数据指标监控也变得尤为重要&#xff0c;研发人员和运营人员需要对线上的产品指标有所感知&#xff0c;同时风险也需要及时暴露&#xff0c;很多公司开始自建监控系统&#xff0c;但对于一些定制化要求不是特别高的团队&a…

LV.13 D6 Linux内核安装及交叉编译 学习笔记

一、tftp加载Linux内核及rootfs 1.1 uboot内核启动命令 bootm 启动指定内存地址上的Linux内核并为内核传递参数 bootm kernel-addr ramdisk-addr dtb-addr 注: kernel-addr: 内核的下载地址 ramdisk-addr: 根文件系统的下载地址 …

蓝牙物联网室内定位系统解决方案

目前国内外室内定位技术较多&#xff0c;常见的有无线局域网(Wireless Fidelity,WiFi)、射频识别(Radio FrequencyIdentification,RFID)、蓝牙低功耗(Bletooth Low EnergyBLE)、超宽带(Ultra Wide BandUWB)技术等。近几年智能设备的迅速发展和蓝牙设备的生产制造成本越来越低&a…

单元测试(超详细整理)

前言 为什么我们需要测试&#xff1f; 让产品可以快速迭代&#xff0c;同时还能保持高质量 对于一些相对稳定的系统级别页面&#xff0c;自动化测试在提高测试的效率的方面起到非常重要的作用。前端的自动化测试主要包括&#xff1a;浏览器测试和单元测试。Vue官方脚手架自带…

Unity中Shader观察空间推导(在Shader中实现)

文章目录 前言一、观察空间矩阵推导1、求观察空间基向量2、求观察空间的基向量在世界空间中的矩阵 的 逆矩阵2、求平移变换矩阵3、相乘得出 观察空间转化矩阵4、得到顶点的世界空间坐标&#xff0c;然后转化到观察空间5、把观察空间坐标转化为齐次裁剪坐标输出到屏幕 二、最终效…

Python入门学习篇(五)——列表字典

1 列表 1.1 定义 ①有序可重复的元素集合 ②可以存放不同类型的数据 ③个人理解:类似于java中的数组1.2 相关方法 1.2.1 获取列表长度 a 语法 len(列表名)b 示例代码 list2 [1, 2, "hello", 4] print(len(list2))c 运行结果 1.2.2 获取列表值 a 语法 列表名…

STM32实现三个小灯亮

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_P…

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决&#xff0c;完全取代路由器。 使用 倍控的 N5105 设备&#xff0c;有 mPCIe 接口&#xff0c;使用了 intel AX200 无线网卡&#xff0c;支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi&#xff0c;在…

Docker知识总结

Docker 学习目标&#xff1a; 掌握Docker基础知识&#xff0c;能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用应用的安装 掌握docker迁移与备份相关命令 能够运用Dockerfile编写创建容器的脚本 能够…

51单片机拆字程序实验

一、实验内容 1.基本要求 熟悉51仿真系统&#xff1b;设计并单步调试&#xff0c;实现将R5中数值&#xff08;初值为本人学号后两位&#xff09;拆分成两位独立的数据分别存于R6,R7中&#xff1b; 2.扩展要求 将R6,R7中的被拆出来的一位HEX数据转换为可显示的ASCII编码&…

Python算法例27 对称数

1. 问题描述 对称数是一个旋转180后&#xff08;倒过来&#xff09;看起来与原数相同的数&#xff0c;找到所有长度为n的对称数。 2. 问题示例 给出n2&#xff0c;返回[&#xff02;11&#xff02;&#xff0c;&#xff02;69&#xff02;&#xff0c;&#xff02;88&#x…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…

simulinkveristandlabview联合仿真——模型导入搭建人机界面

目录 1.软件版本 2.搭建simulink仿真模型 编译错误 3.导入veristand并建立工程 4.veristand导入labview labview显示veristand工程数据 labview设置veristand工程数据 运行labview工程 1.软件版本 matlab2020a&#xff0c;veristand2020 R4&#xff0c;labview2020 SP…

第1课 配置FFmpeg+OpenCV开发环境

一、配置开发环境 1.下载FFmpegOpenCV开发所用的SDK压缩包&#xff0c;并解压到E:\SDK下&#xff0c;解压后的路径应为&#xff1a;E:\SDK\ffmpeg-sdk\58\x86\dll及E:\SDK\opencv-sdk\340\x86\dll。 2.新建VC项目&#xff0c;名称为demo1&#xff0c;项目类弄为MFC应用程序&a…

2023年浙大城市学院新生程序设计竞赛(同步赛)G

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先想法非常单一&#xff0c;一定是去枚举操作点&#xff0c;然后看它染白和不染的价值差值 也就是说&#xff0c;把一个黑色结点染白之后&#xff0c;对哪些结点的价值会影响 不难想象其实就是操作结点的子树和该点连通的…