排序算法总结(Python版本)

2023-11-17

看了很多排序算法,每种算法都有多个版本,现总结一版自己觉得容易理解的,供以后翻阅。

1.插入排序

直接插入排序

直接插入排序是将一个数插入到已经排序好的序列中。做法是先将第一个数作为已经排序好的,依此将后面的数取出插入到前面已排序好的序列中。

def insert_sort(nums):
    for i in range(len(nums)):
        for j in range(i):
            if nums[j]>nums[i]:
                #nums.insert(j,nums.pop(i))
                nums[j],nums[i]=nums[i],nums[j]
    return nums

关于插入的具体操作,这里既可以用 nums[j],nums[i]=nums[i],nums[j],也可以用 nums.insert(j,nums.pop(i))

时间复杂度为,空间复杂度为。是稳定的排序算法。

希尔排序

先按一定的增量将数据分组,每组进行直接插入排序,随着增量的减少,每组的数越来越多,最后所有数据成为一组。

def shell_sort(nums):
    step=len(nums)//2
    while step>0:
        for i in range(step,len(nums)):
            while i>=step and nums[i-step]>nums[i]:     #每组进行直接插入排序
                nums[i-step],nums[i]=nums[i],nums[i-step]
                i-=step
        step//=2    #增量每次的变化
    return nums
时间复杂度为 ,空间复杂度为 。不是稳定的排序算法。


2.交换排序

冒泡排序

从序列头开始,每次比较两个元素。若他们顺序错误则进行交换,直到遍历完序列为止。

def buble_sort(nums):
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            if nums[i]>nums[j]:
                nums[i],nums[j]=nums[j],nums[i]
    return nums
时间复杂度为 ,空间复杂度为 。是稳定的排序算法。
快速排序

通过一趟排序将序列分为两部分,一部分比某个数大,另一部分比某个数小。再按此方法对两部分数据进行排序,知道整个序列有序。

def quick_sort(nums):
    if nums==[]:
        return []
    else:
        partition=nums[0]
        left=quick_sort([l for l in nums[1:] if l<partition])
        right=quick_sort([r for r in nums[1:] if r>=partition])
        return left+[partition]+right

时间复杂度为,空间复杂度为。不是稳定的排序算法。

3.选择排序

简单选择排序

第1趟,在待排序记录r1 ~ r[n]中选出最小的记录,将它与r1交换;第2趟,在待排序记录r2 ~ r[n]中选出最小的记录,将它与r2交换;以此类推,第i趟在待排序记录r[i] ~ r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。

def select_sort(nums):
    for i in range(len(nums)):
        x=i
        for j in range(i+1,len(nums)):
            if nums[j]<nums[x]:
                x=j
        nums[x],nums[i]=nums[i],nums[x]
    return nums
时间复杂度为 ,空间复杂度为 。不是稳定的排序算法。
堆排序

它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

def heap_sort(hlist):
    def heap_adjust(parent):
        child=2*parent+1    #左孩子
        while child<len(heap):
            if child+1<len(heap):
                if heap[child]<heap[child+1]:
                    child+=1    #判断左右孩子里的较大值
            if heap[parent]>=heap[child]:
                break
            heap[parent],heap[child]=heap[child],heap[parent]   #最大值作为父节点
            parent,child=child,child*2+1    #调整下一个

    heap,hlist=hlist,[]
    for i in range(len(heap)-1,-1,-1):  #建立大顶堆
        heap_adjust(i)
    while len(heap)>0:
        heap[0],heap[-1]=heap[-1],heap[0]
        hlist.insert(0,heap.pop())    #弹出最大结点并进行调整
        heap_adjust(0)
    return hlist
时间复杂度为 ,空间复杂度为 。不是稳定的排序算法。

4.归并排序

采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

def merge_sort(nums):
    def merge(left,right):
        array=[]
        while left and right:
            if left[0]<right[0]:
                array.append(left.pop(0))
            else:
                array.append(right.pop(0))
        if left:
            array+=left
        elif right:
            array+=right
        return array

    def recursive(nums):
        if len(nums)==1:
            return nums

        mid=len(nums)//2
        left=recursive(nums[:mid])
        right=recursive(nums[mid:])
        return merge(left,right)

    return recursive(nums)
时间复杂度为 ,空间复杂度为 。是稳定的排序算法。


5.基数排序

对于数组中的元素,首先按照最低有效数字进行排序,然后由低位向高位进行。

对于3个元素的数组[977, 87, 960],第一轮排序首先按照个位数字相同的放在一个桶s[7]=[977],s[7]=[977,87],s[0]=[960]执行后list=[960,977,87].第二轮按照十位数,s[6]=[960],s[7]=[977],s[8]=[87],执行后list=[960,977,87].第三轮按照百位,s[9]=[960],s[9]=[960,977],s[0]=87,执行后list=[87,960,977],结束。

def radix_sort(nums):
    s=[[]]
    digit=0
    while len(s[0])!=len(nums):     #所有元素全排到第一个桶后,结束
        s=[[] for i in range(10)]   #定义10个桶
        for i in nums:
            index=i//(10**digit)%10     #从个位开始,依次入桶
            s[index].append(i)
        nums=[]
        for i in range(len(s)):
            nums+=s[i]
        digit+=1
    return nums
时间复杂度为O(d(r+n),空间复杂度为O(rd+n)。是稳定的排序算法。


各排序算法总结


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法总结(Python版本) 的相关文章

  • (Django) (外键问题) model.person_id 不能为 NULL

    我知道这在 Django 圈子里似乎是一个被过度询问的问题 但我不敢说我 还没有找到解决方案 我的模型 from djago import User class InfoPersonal models Model person models
  • 为什么 urllib2 出现 urllib2.HTTPError 而 urllib 没有错误?

    我有以下简单的代码 import urllib2 import sys sys path append BeautifulSoup BeautifulSoup 3 1 0 1 from BeautifulSoup import page h
  • 数据操作 startdate enddate python pandas

    我有一个促销描述数据集 其中包含有关正在运行的各种促销活动及其开始日期 结束日期的信息 promo item start date end date Buy1 get 1 A 2015 01 08 2015 01 12 Buy1 get 1
  • 隐藏控制台并执行 python 脚本

    我正在尝试使用 pyinstaller 在 Windows 10 上使用 pyqt5 模块编译在 python 3 中构建的 python 脚本 该脚本在运行时隐藏窗口 为了编译我的脚本 我执行了以下命令 pyinstaller onefi
  • 如何在cvxpy中编写多个约束?

    我想在 cvxpy 下的优化问题中添加许多约束 在 matlab 中 我可以通过添加一行 subject to 然后使用 for 循环来生成约束 我怎样才能在 cvxpy 中做同样的工作 因为 cvxpy 中没有 服从 概念 有什么建议吗
  • python: X 服务器上的致命 IO 错误 11(资源暂时不可用):0.0

    我正在尝试读取一些图像 稍后打算对它们执行一些任务 同时将图像读入内存 我想显示动画 gif 图像 为此 我必须使用线程 现在它给出错误 python Fatal IO error 11 Resource temporarily unava
  • 使用 Pandas 滚动差异

    您好 我正在尝试使用 Pandas 滚动函数来计算下表中的滚动差异 我正在尝试生成 每月可用项目 列中的值 但没有得到任何结果 请帮忙 Item Adds Subtracts Month Monthly Available items A
  • Python - 使用 win32com.client 将 Excel 单元格范围格式化为表格

    我正在尝试编写一个函数 该函数选择工作表中的所有非空单元格 根据内容调整列宽 并将其格式化为表格 我被困在最后一点 这是我当前的代码 import win32com client from win32com client import co
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • 设置区域设置和字符串模块

    这个简单的脚本 from locale import LC ALL setlocale print setlocale LC ALL from string import letters print letters 给我这个输出 tr TR
  • 在Python中随机化列表[重复]

    这个问题在这里已经有答案了 我想知道是否有一个好方法来 震动 Python 中的项目列表 例如 1 2 3 4 5 可能会被动摇 随机化 3 1 4 2 5 任何顺序都同样可能 from random import shuffle list
  • Emacs:调试Python的方法

    我把这个贴在程序员 stackexchange com https softwareengineering stackexchange com questions 29844 emacs methods for debugging pyth
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 没有名为 urllib.parse 的模块(我应该如何安装它?)

    我正在尝试在 CentOS 7 上运行 REST API 我读到 urllib parse is in Python 3 但我使用的是 Python 2 7 5 所以我不知道如何安装此模块 我安装了所有要求 但仍然无法运行该项目 当我寻找
  • 如何点击 Google Trends 中的“加载更多”按钮并通过 Selenium 和 Python 打印所有标题

    这次我想单击一个按钮来加载更多实时搜索 这是网站的链接 该按钮位于页面末尾 代码如下 div class feed load more button Load more div 由于涉及到一些 AngularJS 我不知道该怎么做 有什么提
  • 对 Python 的 id() 感到困惑[重复]

    这个问题在这里已经有答案了 我可以理解以下定义 每个对象都有一个身份 类型和值 对象的身份 一旦创建就永远不会改变 你可能会认为它是 对象在内存中的地址 这is操作员比较身份 两个物体 这id 函数返回一个代表其值的整数 身份 我假设上面的
  • 应用程序的外观 - Py2exe / wxPython

    所以我的问题是我的应用程序的外观和感觉 因为它看起来像一个旧的外观应用程序 它是一个 wxPython 应用程序 在 python 上它运行良好并且看起来不错 但是当我使用 py2exe 将其转换为 exe 时 外观很糟糕 现在我知道如果你
  • 用于获取有关 SVN 存储库信息的 Python 库?

    我正在寻找一个可以从 SVN 存储库中提取 至少 以下信息的库 not工作副本 修订号及其作者和提交消息 每个修订版中的更改 添加 删除 修改文件 有Python库可以做到这一点吗 对于作者和提交消息 我可以解析 db revprops 0

随机推荐

  • Java中使用MultipartFile 接受图片或者文件超过2MB就会出现异常MultipartFile类型不能接受

    解决方法 在配置文件中写入这个配置 然后就可以根据业务在进行限制了
  • 混淆保护需正确命名!看.NET Core代码保护工具.NET Reactor如何规定

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • 大端对齐 和小端对齐

    大端对齐 高内存地址放整数高位 低内存地址放整数低位 例如x86 arm都是采用大端对齐 小端对其 高内存地址放整数低位 低内存地址放整数高位 例如unix大型服务器 转载于 https www cnblogs com Json28 p 1
  • Linux内核文件系统知识大总结

    1 文件系统特点 文件系统要有严格的组织形式 使得文件能够以块为单位进行存储 文件系统中也要有索引区 用来方便查找一个文件分成的多个块都存放在了什么位置 如果文件系统中有的文件是热点文件 近期经常被读取和写入 文件系统应该有缓存层 文件应该
  • crash 工具使用

    1 rd 命令 用法 读取内核虚地址或者内核符号值 默认16进制显示 类型为unsigned long 并且会将值对应的ascii码显示出来 rd lt 内核地址 gt 或 rd lt 内核符号 gt 如果不需要将右边的ascii码显示出来
  • 【AIX 命令学习】lspv -M hdisk1

    lspv M hdisk1查看 hdisk1物理分区与逻辑分区的对应关系 pvname PP PP LVname LP COPY PVname 系统指定的物理卷名称 PP物理卷上的物理分区编号 如果一段连续的物理分区是空闲的 则使用一段PP
  • 计算机网络之7层协议

    7层协议图解 通俗的理解 1 首先物理层解决两个硬件之间怎么通信 具体就是一台发些比特流 然后另一台能收到 物理层的作用 主要定义物理设备标准 如网线的接口类型 光纤的接口类型 各种传输介质的传输速率等 它的主要作用是传输比特流 就是由1
  • el-tabs中使用Echarts警告。Can‘t get DOM width or height. Please check dom.clientWidth and dom.clientHeight

    具体警告 Can t get DOM width or height Please check dom clientWidth and dom clientHeight They should not be 0 For example yo
  • SnowFlake 雪花算法实现以及详解

    背景简介 现在的服务基本是分布式 微服务形式的 而且大数据量也导致分库分表的产生 对于水平分表就需要保证表中 id 的全局唯一性 对于 MySQL 而言 一个表中的主键 id 一般使用自增的方式 但是如果进行水平分表之后 多个表中会生成重复
  • 软件测试基础之软件缺陷处理

    一 什么是缺陷 不满足用户确定需求 影响软件功能实现的问题 故障 缺陷就是人们通常所说的bug ex 一下哪一种选项不属于软件缺陷 A 软件没有实现产品规格说明所要求的功能 B 软件中出现了产品规格说明不应该出现的功能 C 软件实现了产品规
  • 【电路设计】RC振荡器 - 文氏电桥振荡器

    一 文氏电桥振荡器的工作原理 文氏电桥振荡器广泛用于产生几Hz到几百kHz频段范围的可变频率振荡器 主要由两部分构成 具有正反馈作用的RC串并联选频网络 gt 以满足相位平衡条件 具有负反馈作用的同相放大器 gt 以满足振幅平衡条件 其工作
  • Qt中用textEdit发送文本遇到的换行问题

    用textEdit发送文本遇到的换行问题 在开发BLE通讯的过程中遇到了以下问题 在自己写的BLE上位机的输入框textEdit中输入数据 回车换行之后发送 但串口调试助手处接收的数据没有换行 但是在串口调试助手的输入框中输入数据再回车换行
  • Blender使用maya系快捷键

    文章目录 第一步 将config文件夹放入 第二步 将maya快捷键 以及类maya面板放入 空格以及右键的饼面板 第三步 在blender里将mayaKey里的快捷键导入 并选择 第四步 融合blender本身的快捷键 可选 1 从ble
  • 英伟达驱动更新记录_N卡驱动更新软件(NVIDIA GeForce Experience) v3.16.0.122 官方版

    NVIDIA GeForce Experience显卡驱动更新软件可以帮助你检查计算机的geforce驱动程序 并且将其更新到最新的版本 更新显卡驱动有利于更稳定流畅的运行游戏 功能介绍 1 让驱动程序始终处于最新状态 GeForce Ex
  • Docker容器之私有仓库(Harbor)

    创建私有仓库 下载registry镜像 docker pull registry 指定镜像仓库地址 vim etc docker daemon json insecure registries 192 168 159 11 5000 添加此
  • java.lang.NoSuchMethodError: org.springframework.data.redis.core.StringRedisTemplate.delete redis删报错

    java lang NoSuchMethodError org springframework data redis core StringRedisTemplate delete Ljava lang Object V springboo
  • KEIL 断点调试技巧

    实际项目中断点调试起了很大作用 Keil的断点调试功能很强大 除了普通的设置断点运行到断点处 还有单步 跳转 除了这些常规的方法 对于一些疑难杂症 常规方法就有点杯水车薪了 下面我总结下我在工作中常用的几种断点调试技巧 1 断点位置运行次数
  • Linux 中的 chsh 命令及示例

    Linux中的chsh命令用于更改用户的登录shell 当前为登录shell Shell是与操作系统交互的用户界面 可以被认为是操作系统的外层 bash shell 是 Linux 中使用最广泛的登录 shell 之一 该命令允许用户从当前
  • selenium处理12306出发地value值修改不成功

    不知道你们在使用ui框架编写12306时 有没有遇到过这样的问题 在使用selenium去编写场景时发现出发地这个input标签 每次都没办法按照你的预期去修改值 例如 首先在浏览器里使用document发现完全可以修改掉输入框的值 然后兴
  • 排序算法总结(Python版本)

    看了很多排序算法 每种算法都有多个版本 现总结一版自己觉得容易理解的 供以后翻阅 1 插入排序 直接插入排序 直接插入排序是将一个数插入到已经排序好的序列中 做法是先将第一个数作为已经排序好的 依此将后面的数取出插入到前面已排序好的序列中