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;接着一步一步安装就可…

小程序提供几种结算周期? T+1是什么意思?

小程序提供4种固定的阶梯周期选择:T1、T7、T14、T28;其中T代表“Today”&#xff0c;今天的收入会在1(第2天)后自 动结算至银行卡上。

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

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

计算机术语翻译在线,计算机术语翻译

小编为大家整理了计算机术语翻译&#xff0c;希望对你有帮助哦!计算机术语翻译&#xff1a;so-dimm(small outline dual in-line memory modules&#xff0c;小型双重内嵌式内存模块)spd(serial presence detect&#xff0c;串行存在检查)sram(static random access memory&…

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

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

JS中原型链的理解

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

返利是什么意思

就是将钱返给你。 按消费金额的10%返利&#xff1a; 如果你消费1000元&#xff0c;返给你100010%100元&#xff1b;

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

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

html引用c 变量,Y.A.K.E

记录一次C项目改造中定义全局变量的操作.我对C/c不太熟悉,在修改别人项目的时候,想弄个文件,专门存放全局变量.然后各种不对.xxx previously defined here错误 或者 error: redefinition of xxx或者initialized and declared extern反正各种问题.其实根本原因就是重复引用导致的…

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

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

CentOS 搭建 LAMP服务器

CentOS 7.0默认使用的是firewall作为防火墙&#xff0c;这里改为iptables防火墙。 1、关闭firewall&#xff1a; systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 2、安装iptables防火墙 yum install iptables-ser…

什么叫兜底条款

就是一个条款就能覆盖所有未说到的内容:如:"其它应当受到处罚的行为." 有了这样的条款,制度和法律才不会出现死角,让一些人钻空子,由于规定不可能十分周全,所心好多人还是在想方设法钻空子.

当你的电脑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;通过这种…

an导入html5,H5-FLASH:AN HTML5-BASED FLASH RUNTIME

摘要&#xff1a;Flash has been widely deployed to many internet applications.Nevertheless,as a closed development platform,there are more and more concerns arisen around its security and performance problems.On the other hand,HTML5 provides an alternative …

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…