list 排序_十个必知的排序算法|Python实例系列

十大排序:

1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶排序10.基数排序

78d0f9bfed7a183de1429d60973d3d5a.png

完整代码和注释如下

# -*- coding: UTF-8 -*-#Space: https://github.com/Tri-x/exercise#Space: https://space.bilibili.com/187492698#Author: Trix#Description: 十大经典排序算法#Python的排序算法用的是Tim Sort 一种源自归并排序和插入排序的稳定高效的排序算法 也许以后会单独做一期视频来介绍该算法#也许以后会做一期视频来介绍一些奇葩的排序算法 比如 睡眠排序、猴子排序、面条排序、珠排序from random import randint#随机整数from time import process_time#计时nums_lists=[[]for n in range(4)]#随机创建四个无序数列 用来粗略地测试每种排序算法的用时for n in range(500):#数列长度为500nums_lists[0].append(randint(-400,400))#随机范围(-400,400)for n in range(1000):nums_lists[1].append(randint(-8000,8000))for n in range(5001):nums_lists[2].append(randint(-2000,2000))for n in range(10000):nums_lists[3].append(randint(-9000,9000))#由于创建的随机数列太长,就不打印排序前和排序后的结果了def bubble_sort(num_list):#冒泡排序 该算法名字的由来是因为越小的值会慢慢"浮"到数列的顶端#循环遍历数列,一次比较两个相邻的值,如果后者值大于前者值,就把他们的位置互相交换for n in range(len(num_list)-1):#因为最后一次已经顺序正确了所以循环次数-1for m in range(len(num_list)-1-n):#循环每结束一次 这一次循环中最大的值会移动到上一次循环中最大值的前一位 数列中后面的值已经有序 所以次数-nif num_list[m]>num_list[m+1]:#大小比较num_list[m+1],num_list[m]=num_list[m],num_list[m+1]#位置交换return num_listdef select_sort(num_list):#选择排序 选择最小值#每次循环在数列中找到最小值,放到上一次循环找到的最小值的后一位,第一次放在首位for n in range(len(num_list)-1):#因为最后一次已经顺序正确了所以循环次数-1min_index=n#设最小值为索引为n的值for m in range(n,len(num_list)):#n值前已完成排序if num_list[m]=1:#控制步长范围#以下为插入排序的内容 并对插入排序进行了改进for n in range(gap,len(num_list)):while (n-gap)>=0:#控制比较范围if num_list[n]基准值,exchange_index不变,exchange_index仍为0n=3时,扫描值6>基准值,exchange_index不变,exchange_index仍为0n=4时,扫描值3每个左右子节点的完全二叉树#这样每次构建后索引[0]为最大值,在第n次结束,就把[0]和[-n]位置互换 在[0:-n-1]的范围内进行下次的完全二叉树构建list_len=len(num_list)#获取数列长度for n in range(list_len//2,-1,-1):#list_len//2为父节点索引的规律 //表示除法向下取整 n∈[list_len//2,-1),n∈Z range(start,stop,step) step为-1时为从后往前遍历heapify(num_list,list_len,n)#数列完全二叉树的初始化 构建每个父节点>每个左右子节点的完全二叉树for n in range(list_len-1,0,-1):#n∈[list_len-1,0),n∈Znum_list[0],num_list[n]=num_list[n],num_list[0]#对上一次构建完成的二叉树 首尾值互换list_len-=1#限定这一次构造完全二叉树的范围heapify(num_list,list_len,0)#由于已经初始化完成 可以直接从首项开始 在不包含上次最大值的范围内进行构造完全二叉树return num_listdef heapify(num_list,list_len,parent_index):#构建父节点>左右子节点的完全二叉树#第n排有n^(n-1),从左到右填充数值,可以得到父节点索引和左右子节点索引的规律left_index=2*parent_index+1#对于每个父节点索引 左节点索引的规律right_index=left_index+1#对于每个父节点索引 右节点索引的规律max_index=parent_index#假设父节点比左右子节点值都大 默认最大值的索引为父节点索引if left_indexnum_list[max_index]:#如果在列表范围内 左节点值>父节点值max_index=left_index#父节点和左节点的索引互换if right_indexnum_list[max_index]:#右节点同理max_index=right_indexif max_index!=parent_index:#如果现在的父节点索引不等于一开始的假设的最大值的索引 说明父节点和它的某一节点需要互换索引值num_list[parent_index],num_list[max_index]=num_list[max_index],num_list[parent_index]heapify(num_list,list_len,max_index)#递归构建整个数列的完全二叉树def count_sort(num_list):#计数排序 数数#找出数列中最大值和最小值 创建min~max这么多个0用来统计数列中每个值出现的次数,再从最小值依次排放到最大值max_num=max(num_list)#找到最大值min_num=min(num_list)#找到最小值neg_list=[]#负数数列pos_list=[]#非负数数列for num in num_list:#对负数和非负数分别处理if num<0:neg_list.append(num)#向负数数列添加负数if num>=0:pos_list.append(num)#向非负数数列添加非负数if len(neg_list)!=0:#如果有负数neg_counts_list=[0 for n in range(min_num,0)]#创建最小值这么多个0来累计每个负数出现的次数for n in range(len(neg_list)):#对于负数数列中的每个值neg_counts_list[neg_list[n]]+=1neg_index=0#初始排序索引为0for n in range(-len(neg_counts_list),0):#对于计数列表中的每一项while neg_counts_list[n]>0:#不为0就说明有计数 为0说明没有计数neg_list[neg_index]=n#依次排放数值neg_index+=1#每次排放后index+1neg_counts_list[n]-=1#每次排放后数值所对应的计数-1if len(pos_list)!=0:#如果有非负数pos_counts_list=[0 for n in range(max_num+1)]#创建max+1这么多个0来累计每个非负数出现的次数 因为是以每个值为索引 所以要max+1个0for n in range(len(pos_list)):#对于数列中的每个非负值pos_counts_list[pos_list[n]]+=1#计数列表索引和数列的值一一对应pos_index=0#初始排序索引为0for n in range(len(pos_counts_list)):#对于计数列表中的每一项while pos_counts_list[n]>0:#不为0就说明有计数 为0说明没有计数pos_list[pos_index]=n#依次排放数值pos_index+=1#每次排放后index+1pos_counts_list[n]-=1#每次排放后数值所对应的计数-1result_list=neg_list+pos_list#负数数列和非负数数列结合return result_listdef bucket_sort(num_list):#桶排序 计数排序的改进版#找出数列中最大值和最小值 创建min~max这么多个桶用来统计数列中每个值出现的次数,再从第一个桶倾倒到最后一个桶bucket_list=[0 for n in range(max(num_list)-min(num_list)+1)]#创建min~max这么多个桶for n in range(len(num_list)):#对于当前值bucket_list[num_list[n]-min(num_list)]+=1#添加到值对应的桶内 即对应桶计数+1result_list=[]#结果列表for n in range(len(bucket_list)):#对于每个桶if bucket_list[n]!=0:#如果桶内有数result_list+=[n+min(num_list)]*bucket_list[n]#直接把桶里的所有数倒出来return result_listdef radix_sort(num_list):#基数排序 比较位数上的值#比较每一位上的数字大小 当每一位比较完成排序也就完成pos_list=[]#负数数列neg_list=[]#非负数数列for num in num_list:#对负数和非负数分别处理if num<0:neg_list.append(num)if num>=0:pos_list.append(num)if len(neg_list)!=0:#如果有负数neg_num_digit=0#初始位数while neg_num_digit

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271561.shtml

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

相关文章

MySQL的安装及使用教程

MySQL的安装及使用教程 一、 MySQL的下载及安装 首先登陆MySQL的官网&#xff0c;选择Downloads→Windows→MySQL Installer→Windows(x86,32-bit),MSI Installer 在安装的时候&#xff0c;可能要下载 .net Framework&#xff0c;直接下载就行&#xff0c;接着一步一步安装就可…

提高国内访问GitHub速度的9种方案~

GitHub 镜像访问GitHub文件加速Github 加速下载加速你的 Github谷歌浏览器 GitHub 加速插件(推荐)GitHub raw 加速GitHub Jsdelivr通过 Gitee 中转 fork 仓库下载通过修改 HOSTS 文件进行加速为什么 github 下载速度这么慢&#xff1f;如何提高 github 的下载速度&#xff1f;…

python数据可视化源码_Python数据分析:基于Plotly的动态可视化绘图 随书源码[101MB]...

随着信息技术的发展和硬件设备成本的降低&#xff0c;当今的互联网存在海量的数据&#xff0c;要想快速从这些数据中获取更多有效的信息&#xff0c;数据可视化是重要的一环。对于Python语言来说&#xff0c;比较传统的数据可视化模块是Matplotlib&#xff0c;但它存在不够美观…

JS中原型链的理解

在谈原型链之前&#xff0c;我们首先要了解自定义函数与 Function 之间是什么关系&#xff0c;而构造函数、原型和实例之间又存在什么千丝万缕的关系呢&#xff1f;其实&#xff0c;所有的函数都是 Function 的实例。在构造函数上都有一个原型属性 prototype&#xff0c;该属性…

计算机系统基础:总线结构知识笔记

1、总线定义 计算机和设备之间传输信息的公共数据通道&#xff0c;是连接计算机硬件内多种设备的通信线路。它实现了总线上所有设备共享。 2、总线的分类 2.1 数据总线&#xff08;DB&#xff09; 用来传递数据信息&#xff0c;双向的。数据总线的宽度决定了CPU和计算机奇特设备…

linux python开发环境_如何在Linux系统中搭建Python编程环境

1 在大多数的Linux系统中&#xff0c;基本上都默认安装了Python&#xff0c;也就是说&#xff0c;在Linux的系统中基本上是不需要安装什么软件&#xff0c;就可以使用Python。 下面以ubuntu操作系统为例&#xff0c;看看如何在Linux操作系统中搭建Python编程环境。2 检查Ubuntu…

当你的电脑C盘满了怎么办?这两种方法都能解决

用了好几年的电脑&#xff0c;在分区的时候C盘空间分的太小&#xff1b;有的喜欢把下载的软件、工作时的文件都放在桌面上方便自己使用&#xff1b;有的安装软件的时候不选择安装目录或一些软件必须要安装在C盘&#xff0c;这样你的C盘的空间就会变得不够&#xff0c;今天分享下…

一个html有几个css,几个CSS的黑科技_html/css_WEB-ITnose

原文出处&#xff1a; JellyBool(JellyBool) 欢迎分享原创到伯乐头条昨天由于某些原因没有写博客&#xff0c;之前说好的每天一篇的&#xff0c;这篇是为了补昨天的了。然后我就要当一次标题党了。这里的黑科技其实就是一些CSS中不怎么为人所知但在解决某些问题的时候很溜的属性…

python递归函数讲解_带你深入学习Python——Python递归详解!

一、递归 递归:在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身这个就叫递归 注&#xff1a;Python在递归中没有像别的语言对递归进行优化&#xff0c;所以他的每一次调用都会基于上一次的调用进行&#xff0c;并且他设置了最大的递归数量防止递归外溢 递归调用…

51nod 1040最大公约数和(欧拉函数)

1040 最大公约数之和题目来源&#xff1a; rihkddd基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 80 难度&#xff1a;5级算法题收藏关注给出一个n&#xff0c;求1-n这n个数&#xff0c;同n的最大公约数的和。比如&#xff1a;n 61,2,3,4,5,6 同6的最大公…

计算机安全基础:加密技术知识笔记

1、加密技术介绍 加密技术是最常用的数据安全保密的手段&#xff0c;加密技术的关键在于加密/解密算法和密钥管理。 数据加密的过程&#xff1a;对明文文件或数据按照某种算法进行处理&#xff0c;变成密文。密文需要根据相应的密钥才能获得原来的明文信息&#xff0c;通过这种…

JAVA 获取格林威治时间(GMT)

记录下获取GMT时间的方法&#xff1a; //格式可根据需要自定义&#xff0c;如yyyy-MM-dd HH:mm:ss 等等 SimpleDateFormat sdf new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss GMT", Locale.US); Calendar calendar Calendar.getInstance(); sdf.setTimeZone(Tim…

Linux CentOS下安装Oracle

1 、在安装oracle之前首先安装以下组件包&#xff0c;直接输入下列语句安装。 yum install binutils* -y yum install compat-lib* -y yum install gcc* -y yum install glibc* -y yum install ksh* -y yum install libgcc* -y yum install libstdc* -y yum install libaio* -y…

计算机安全基础:认证技术知识笔记

1、认证技术介绍 认证技术主要是用来解决网络通信过程中通信双方身份的认可。认证的过程涉及加密和密钥交换。认证方一般都会有账户名、口令、使用摘要算法和基于PKI认证。 2、PKI系统介绍 PKI是一种遵循既定标准的密钥管理平台&#xff0c;能够为所有的网络应用提供加密和数字…

python 比例之差z假设检验_假设检验在数据分析中的应用

前言Z检验T检验独立样本t检验配对样本t检验单样本t检验前言在这篇文章中&#xff0c;我不会具体去推导检验统计量和相应拒绝域的得出&#xff0c;这对于大部分非统计学专业的人士来说是晦涩的&#xff0c;我只想通过一个案例告诉大部分初学者假设检验怎么在数据挖掘中使用。%ma…

Java实现字母的大小写转换

String result1 "JAVA";String result2 "springcloud";/*** toLowerCase()* 大写转小写*/System.out.println(result1.toLowerCase());/*** 小写转大写* toUpperCase()*/System.out.println(result2.toUpperCase()); 运行截图如下:

iOS开发tableview二级联动的细节实现中注意的细节总结

首先说网络慢带来的数据显示问题 可以通过判断请求参数是否一致来刷新tableview。 SJBCategaryModel * categaryModel self.categarys[CategarySelectRow]; NSMutableDictionary * params [NSMutableDictionary dictionary]; categaryModel.currentPage 1; params["a&q…

linux ctrlc 退出循环_linux按行读取 (while read line与forloop)

在linux下一般用while read line与for循环按行读取文件。这两种方法有什么区别呢&#xff1f;现有如下test.txt文件&#xff1a;1while read linewhile read line; do echo $linedone < test.txt输出结果与上图一致。这里也可以写为&#xff1a;cat test.txt | while read …

计算机系统基础:计算机可靠性知识笔记

1、计算机可靠性介绍 计算机的硬件故障通常都是由于元器件失效造成的。元器件的可靠性分为三个阶段&#xff1a;开始阶段元器件处于不稳定阶段失效率比较高、第二阶段是正常工作阶段&#xff0c;失效率最低、第三阶段元器件开始老化&#xff0c;失效率就又开始提高。又称为“浴…

IDEA云行项目提示Error: java: OutOfMemoryError

idea运行项目提示如下 解决方法: 调整一下Compiler下面的Compiler Process heap size 参数&#xff0c;默认的是700。如果2048还不能解决问题&#xff0c;试着将它调得更大一些吧&#xff0c; 修改为2048 修改后运行成功