Python八大排序实现方法

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

如果有什么疑惑/资料需要的可以点击文章末尾名片

1.基数排序

基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,

排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类

# 统计这个列表中数字最大的数字有几位
def radix_sort_nums(nums):max = nums[0]for i in nums:if max < i:max = itimes = 0while max > 0:max = int(max/10)times += 1return times# 每个数字各个位置的数字大小,比如(123,1)则是3,(123,2)则是2
def get_num(num,n):return (int(num/(10**(n-1)))) % 10# 主程序
def radix_sort(nums):count = 10*[None]	# 定义的数组,用于存放当前位数的元素个数bucket = len(nums)*[None]	# 用于暂时存放排序结果# 分别从个位/十位/百位开始循环for pos in range(1, radix_sort_nums(nums)+1):# 每次排序完都要清空各个位数存放的数据统计for i in range(10):count[i] = 0for i in range(len(nums)):# 获得0到9每个位数的个数j = get_num(nums[i], pos)count[j] = count[j]+1# 获得相对应位数的边界值for i in range(1, 10):count[i] = count[i] + count[i-1]for i in range(len(nums)-1, -1, -1):# 求出相应位数的数字j = get_num(nums[i], pos)#将元素按相应位数的上数字的大小排序bucket[count[j]-1] = nums[i]#让相应位数上数字相等的元素不会放在同一位置而被替代count[j] = count[j]-1# 将暂时存储在bucket的元素数据返回到nums中for i in range(0, len(nums)):nums[i] = bucket[i]return numsprint(radix_sort([45, 32, 8, 33, 12, 22, 19, 97]))

2.归并排序

归并排序其实是将原数列分为很多个小数列将其排序,在小数列排序完之后,

再将各个小数列进行排序,最后得到一个全部有序的数列

# 归并排序
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 这个函数主要目的是为了实现合并并排序
def mergearray(nums, first, mid, last, temp):# i, j分别是第一个组数的第一个位置,第二组数的第一个位置i, j, k = first, mid+1, 0# 当俩边数组都存在数的时候,依次比较对应位置的大小while i <= mid and j <= last:if nums[i] <= nums[j]:temp[k] = nums[i]i = i+1k = k+1else:temp[k] = nums[j]j = j+1k = k+1# 第一组数还有多的数的情况while i <= mid:temp[k] = nums[i]i = i+1k = k+1# 第二组数还有多的情况while (j <= last):temp[k] = nums[j]j = j+1k = k+1# 将排列过的数组赋予nums(开始的时候只是部分有序,随着递归最后变成全部有序)for i in range(k):nums[first+i] = temp[i]# 分组,利用递归
def merge_sort(nums,first,last,temp):if first < last:mid = int((first + last) / 2)# 分出第一组数merge_sort(nums, first, mid, temp)# 分出第二组数merge_sort(nums, mid+1, last, temp)# 合并并排序mergearray(nums, first, mid, last, temp)def merge_sort_array(nums):# 创建一个和想要排序数列相同数量的空列表temp = len(nums)*[None]# 利用递归进行排序merge_sort(nums, 0, len(nums)-1, temp)print(merge_sort_array([45, 32, 8, 33, 12, 22, 19, 97]))

3.堆排序

堆排序利用了二叉树的结构,使子节点的值一直小于根节点

def big_endian(arr, start, end):root = startchild = root * 2 + 1  # 左孩子while child <= end:# 孩子比最后一个节点还大,也就意味着最后一个叶子节点了,就得跳出去一次循环,已经调整完毕if child + 1 <= end and arr[child] < arr[child + 1]:# 为了始终让其跟子元素的较大值比较,如果右边大就左换右,左边大的话就默认child += 1if arr[root] < arr[child]:# 父节点小于子节点直接交换位置,同时坐标也得换,这样下次循环可以准确判断:是否为最底层,# 是不是调整完毕arr[root], arr[child] = arr[child], arr[root]root = childchild = root * 2 + 1else:break'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def heap_sort(nums):  # 无序区大根堆排序first = len(nums) // 2 - 1for start in range(first, -1, -1):# 从下到上,从左到右对每个节点进行调整,循环得到非叶子节点big_endian(nums, start, len(nums) - 1)  # 去调整所有的节点for end in range(len(nums) - 1, 0, -1):nums[0], nums[end] = nums[end], nums[0]  # 顶部尾部互换位置big_endian(nums, 0, end - 1)  # 重新调整子节点的顺序,从顶开始调整return numsprint(heap_sort([3, 1, 4, 9, 6, 7, 5, 8, 2, 10]))

4.简单选择排序

简单选择排序的方法则是将所选值与剩下值中比他小的值进行比较

比如选取第一个值,往后找到比他小的值就与其对调,对调后的值再接下去进行比较,直至找到最小的值,随后再第二个值……直至循环到倒数第二个值.

def select_sort(nums):# 遍历所有的值for i in range(len(nums)):# 当前位置初始值min = nums[i]# 与比他后面的值进行比较,小则互换for j in range(i+1, len(nums)):if nums[j] < min:nums[j], min = min, nums[j]# 将值返回数列nums[i] = minreturn numsprint(select_sort([45, 32, 8, 33, 12, 22, 19, 97]))

5.直接插入排序

首先遍历所有元素,随后从第一个数开始将数列从后往前遍历,

如果后面的数小于前面的数,则互换位置,依次推类,直到遍历完成

# 直接插入排序
def insert_sort(nums):for i in range(len(nums)-1):for j in range(i, -1, -1):if nums[j] > nums[j+1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]return numsprint(insert_sort([45, 32, 8, 33, 12, 22, 19, 97]))

6.希尔排序

希尔排序其实就相当于对直接插入排序的升级版,每次都选取一半的长度,

随后利用直接插入法进行排序,从而更快的获得结果

def insert_shell(nums):# 初始化l值,此处利用序列长度的一半为其赋值l = int(len(nums)/2)# 第一层循环:依次改变l值对列表进行分组while l >= 1:# 下面:利用直接插入排序的思想对分组数据进行排序for i in range(len(nums) - 1):for j in range(i, -1, -1):if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]# while循环条件折半l = int(l/2)return nums

7.快速排序

快速排序首先得选取一个基准值,这个代码用第一个数作为基准值,

将比基准值小的值放到左边,比基准值大的值放到右边,

随后再将左边后右边按照上述方法进行排序,直到完全正确为止

# 实现快速排序方法的函数
def quick_sort_num(nums,start,end):if start < end:# 定义基准值为第一个数i, j, pivot = start, end, nums[start]while i < j:# 将基准数右边的数中比基准数小的放到左边while i < j and nums[j] >= pivot:j = j-1if i < j:nums[i] = nums[j]i = i+1# 将基准数左边的数中比基准数大的数放到右边while i < j and nums[i] < pivot:i = i+1if i < j:nums[j] = nums[i]j = j-1nums[i] = pivot# 分别将基准数左边的数列和右边的数列进行递归quick_sort_num(nums, start, i-1)quick_sort_num(nums, i+1, end)return nums
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 快速排序主体函数
def quick_sort(nums):start = 0end = len(nums)-1nums = quick_sort_num(nums, start, end)return numsprint(quick_sort([45, 32, 8, 33, 12, 22, 19, 97]))

8.冒泡排序

冒泡排序是最简单的排序,依次将左右俩个元素进行比较,

每次比较完最后的一个数必定是最大的,依次推类,直到全部元素都比较玩

def bubble_sort(nums):# 交换的轮数for i in range(len(nums) - 1):# 每一轮交换for j in range(len(nums) - i - 1):# 比较值,并根据大小进行互换if nums[j] > nums[j + 1]:nums[j], nums[j + 1] = nums[j + 1], nums[j]return numsprint(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))

9.时间测试

我们先创建一个列表,列表中有10000条数据,随后用相同的数据进行测试

import random
lis = []
for i in range(10000):i = random.randint(0,500)lis.append(i)print(lis)

创出来的数据就不进行展示了。。

随后我们进行测试:

冒泡排序法:11.535502672195435直接插入排序法:12.057243585586548希尔排序法:86.3020749092102(大概是我的方法不大好吧,我差点以为他排不出来了)基数排序法:0.051932334899902344(老大哥就是牛皮)归并排序法:0.08577108383178711233)快速排序:0.04795527458190918堆排序:0.09175491333007812

根据自己的测试,基数排序,归并排序,快速排序,和堆排序速度很快,

感觉随着代码量的增长时间增长很慢,其余的几个则不尽如人意了

尾语

好了,今天的分享就差不多到这里了!

对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

最后,宣传一下呀~👇👇👇 更多源码、资料、素材、解答、交流 皆点击下方名片获取呀👇👇👇

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

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

相关文章

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…

Silicon Labs BG22、xG24、BG27无线SoC比较及信驰达无线模块选型指南

作为安全、智能无线技术领域的前沿品牌&#xff0c;全球知名IC设计公司——Silicon Labs&#xff0c;在最近几年陆续推出了EFR32BG22、EFR32xG24、EFR32BG27等系列无线SoC。RF-star作为物联网行业领先的无线通信模组厂商&#xff0c;基于Silicon Labs的无线SoC推出了RF-BM-BG22…

iOS开发Swift-5-自动布局AutoLayout-摇骰子App

1.在iOS坐标系中&#xff0c;以向左、向下为正方向。图片以左上角为基准点。 2.打开之前的摇骰子App&#xff0c;对它的界面做一些适应所有iPhone机型的效果。 3.先对上方logo做一个y轴约束和一个宽高约束。 宽高约束&#xff1a; 水平居中&#xff1a; 对y轴进行约束。将虚线点…

window 常用基础命令

0、起步 0-1) 获取命令的参数指引 netstat /? 0-2) 关于两个斜杠&#xff1a; window 文件路径中使用反斜杠&#xff1a;\ linux 文件路径中使用&#xff1a;/ 1、开关机类指令 shutdown /s # 关机shutdown /r # 重启shutdown /l …

自然语言处理 微调大模型ChatGLM-6B

自然语言处理 微调大模型ChatGLM-6B 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词&#xff0c;使用上下文将其预测出来&#xff08;相当于完形填空任务&#xff09;&#xff1b; GPT的主要任务是根据前…

ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of

文章目录 ListArrayListLinkedListArrayList与LinkedList的区别快速构建list集合Collections.singletonListArrays.asListImmutableList.of Java集合类型有三种&#xff1a;set(集)、list(列表)和map(映射)&#xff0c;而List集合是很常用的一种集合类型&#xff0c; List 我…

Shell自动化日志维护脚本

简介&#xff1a; 系统日志对于了解操作系统的运行状况、故障排除和性能分析至关重要。然而&#xff0c;长期积累的日志文件可能变得庞大&#xff0c;影响系统性能。在这篇文章中&#xff0c;我们将介绍一个自动化的解决方案&#xff0c;使用 Bash 脚本来监控和维护系统日志文件…

ZooKeeper数据模型/znode节点深入

1、Znode的数据模型 1.1 Znode是什么&#xff1f; Znode维护了一个stat结构&#xff0c;这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起&#xff0c;可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化&#xff0c;版本号就增加。…

【微服务】服务发现和管理技术框架选型调研

选型背景 方案对比 结论 结合实际业务和开发需要&#xff0c;着重考虑性能可靠性、功能和社区支持程度三方面&#xff0c;认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下&#xff1a; 性能更好&#xff0c;可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…

【Hadoop】DataNode 详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Keil 编译 Debug

# 头文件无法导入进来 # 导入头文件&#xff0c;只有函数声明&#xff0c;但缺少函数实现 已经导入了air32f10x_gpio.h但是没有导入 .c&#xff0c;就导致 编译出错出现undefined symbol (某个函数)&#xff0c;这时候按照下面的操作&#xff0c;导入外设模块就好。

HarmonyOS开发:探索动态共享包的依赖与使用

前言 所谓共享包&#xff0c;和Android中的Library本质是一样的&#xff0c;目的是为了实现代码和资源的共享&#xff0c;在HarmonyOS中&#xff0c;给开发者提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;H…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时&#xff0c;需要计算两个日期之间相隔的秒数&#xff0c;我在写的时候直接将两个日期进行相减&#xff0c;得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试&#xff0c;得出的结论是&#xff1a;如果日期类型直接相减&#…

“亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展

生成式AI技术飞速发展&#xff0c;颠覆着人们的生活&#xff0c;正在掀起新一轮的科技革命。在生成式AI的浪潮中&#xff0c;亚马逊云科技旨在为中国的优秀初创企业提供全方位支持&#xff0c;助其抢占先机。 在6月底举办的亚马逊云科技中国峰会上&#xff0c;亚马逊云科技联合…

com.squareup.okhttp3:okhttp 组件安全漏洞及健康度分析

组件简介 维护者square组织许可证类型Apache License 2.0首次发布2016 年 1 月 2 日最新发布时间2023 年 4 月 23 日GitHub Star44403GitHub Fork9197依赖包5,582依赖存储库77,217 com.squareup.okhttp3:okhttp 一个开源的 HTTP 客户端库&#xff0c;可以用于 Android 和 Jav…

CocosCreator3.8研究笔记(三)CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目&#xff0c;来演示CocosCreator 的项目结构。 等待创建完成后&#xff0c;会得到以下项目工程&#xff1a; 一、assets文件夹 assets文件夹&#xff1a;为资源目录&#xff0c;用来存储所有的本地资源&#xff0c;如各种图片&#xff0c;脚本…

【机器学习】人工智能概述(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【算法笔记】二维的哈希与迭代转换;Runtime Error 的解决思路

https://vjudge.net/problem/UVA-11019 如何对一个二维数组进行哈希 对于一个一维数组A(1*M)&#xff0c;哈希的方式是&#xff1a; s e e d M − 1 ∗ A [ 0 ] s e e d M − 2 ∗ A [ 1 ] s e e d M − 3 ∗ A [ 2 ] . . . s e e d 0 ∗ A [ M − 1 ] seed^{M-1}*A[0] …