当前位置:

首页 > 编程开发 > Python八大排序怎么实现

Python八大排序怎么实现

1.基数排序基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类#统计这个列表中数字最大的数字有几位defradix_sort_nums(nums):max=nums[0]foriinnums:ifmax0:max=int(max/10)times+=1returntimes#每个数字各个位置的数字大小,比如(123,1)则是3,(123,2)则是2defget_num(num,n):return(int(num/(10**(n

1.基数排序

基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推类

# 统计这个列表中数字最大的数字有几位
def radix_sort_nums(nums):
    max = nums[0]
    for i in nums:
        if max < i:
            max = i
    times = 0
    while max > 0:
        max = int(max/10)
        times += 1
    return 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] = 0

        for 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 nums

print(radix_sort([45, 32, 8, 33, 12, 22, 19, 97]))

2.归并排序

归并排序其实是将原数列分为很多个小数列将其排序,在小数列排序完之后,再将各个小数列进行排序,最后得到一个全部有序的数列

Python八大排序怎么实现

# 归并排序

# 这个函数主要目的是为了实现合并并排序
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+1
            k = k+1
        else:
            temp[k] = nums[j]
            j = j+1
            k = k+1
	# 第一组数还有多的数的情况
    while i <= mid:
        temp[k] = nums[i]
        i = i+1
        k = k+1
	# 第二组数还有多的情况
    while (j <= last):
        temp[k] = nums[j]
        j = j+1
        k = 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 = start
    child = root * 2 + 1  # 左孩子
    while child <= end:
        # 孩子比最后一个节点还大,也就意味着最后一个叶子节点了,就得跳出去一次循环,已经调整完毕
        if child + 1 <= end and arr[child] < arr[child + 1]:
            # 为了始终让其跟子元素的较大值比较,如果右边大就左换右,左边大的话就默认
            child += 1
        if arr[root] < arr[child]:
            # 父节点小于子节点直接交换位置,同时坐标也得换,这样下次循环可以准确判断:是否为最底层,
            # 是不是调整完毕
            arr[root], arr[child] = arr[child], arr[root]
            root = child
            child = root * 2 + 1
        else:
            break


def heap_sort(nums):  # 无序区大根堆排序
    first = len(nums) // 2 - 1
    for 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 nums

print(heap_sort([3, 1, 4, 9, 6, 7, 5, 8, 2, 10]))

4.简单选择排序

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

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

Python八大排序怎么实现

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] = min
    return nums

print(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 nums

print(insert_sort([45, 32, 8, 33, 12, 22, 19, 97]))

6.希尔排序

希尔排序其实就相当于对直接插入排序的升级版,每次都选取一半的长度,随后利用直接插入法进行排序,从而更快的获得结果

Python八大排序怎么实现

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-1
            if i < j:
                nums[i] = nums[j]
                i = i+1
            # 将基准数左边的数中比基准数大的数放到右边
            while i < j and nums[i] < pivot:
                i = i+1
            if i < j:
                nums[j] = nums[i]
                j = j-1
        nums[i] = pivot
        # 分别将基准数左边的数列和右边的数列进行递归
        quick_sort_num(nums, start, i-1)
        quick_sort_num(nums, i+1, end)
    return nums

# 快速排序主体函数
def quick_sort(nums):
    start = 0
    end = len(nums)-1
    nums = quick_sort_num(nums, start, end)
    return nums

print(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 nums

print(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.08577108383178711(233)

快速排序:0.04795527458190918

堆排序:0.09175491333007812

根据自己的测试,基数排序,归并排序,快速排序,和堆排序速度很快,感觉随着代码量的增长时间增长很慢,其余的几个则不尽如人意了。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
Python安装后怎么打开:使用IDLE或命令行启动解释器
Python安装后怎么打开:使用IDLE或命令行启动解释器

刚在Windows安装好Python却不知道如何启动?本文详细演示如何通过开始菜单找到并打开IDLE集成开发环境,以及如何在PowerShell或命令提示符中使用python和py命令启动交互式解释器、运行.py脚本文件。包含退出解释器的方法及常见启动问题排查,帮助初学者快速验证安装成功并开始编写代码。

Windows系统Python安装教程:下载、勾选PATH及环境变量配置
Windows系统Python安装教程:下载、勾选PATH及环境变量配置

针对Windows初学者的Python安装实战指南。详细讲解如何从Python官网下载匹配架构的安装包,重点演示安装首屏勾选“Add python.exe to PATH”的关键操作,并提供使用python --version和py命令验证环境变量的具体步骤,帮助新手快速搭建开发环境并排查路径问题。

麒麟OS如何查看Python进程的运行状态
麒麟OS如何查看Python进程的运行状态

要想确认麒麟OS中Python程序的运行状态以及资源占用情况,我们可以这样做:用ps -ef | grep python来筛选进程;通过top命令,按P键排序查看实时负载;使用pgrep -f "script.py"精准获取PID;借助lsof -p PID验证文件打开状态。另外,还可以结合syst

Python在Debian上如何配置SSL证书
Python在Debian上如何配置SSL证书

在Debian系统上配置SSL证书通常涉及以下几个步骤:安装Web服务器:首先,你需要一个Web服务器,比如Apache或Nginx。这里以Apache为例。sudo apt updatesudo apt install apache2获取SSL证书:你可以从Let’s Encrypt免费获取SSL

统信UOS怎么安装Python开发环境
统信UOS怎么安装Python开发环境

要想让Python项目在统信UOS上正常运行,得先安装python3、python3-pip、python3-venv、python3-dev以及build-essential等组件。具体操作就是执行sudo apt install命令来一步到位完成安装,同时别忘了配置清华镜像源来给pip加速哦。在

纯Python方案实现中英文全文搜索
纯Python方案实现中英文全文搜索

在互联网上的各类网站中,无论大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。从简单的来说,搜索功能确实很简单,一个简单的select语句就可以实现数据的搜索。而从复杂的来看,无论是搜索的精度还是搜索的效率,都是有很深的研究范围的。对于简单的搜索功能来说,一个s

Mac如何取消通过Python脚本运行的关机程序
Mac如何取消通过Python脚本运行的关机程序

立即在终端输入sudo shutdown -c取消倒计时关机,成功后显示“Shutdown cancelled”;若存在pmset重复任务,需再执行sudo pmset repeat cancel清除。Mac因Python脚本执行了os.system("sudo shutdown -h +10")或

Pythonasyncio异步并发与多固定出口IP调度实战
Pythonasyncio异步并发与多固定出口IP调度实战

之前写过一篇同步场景下用 Python 管理多个固定出口 IP 的实践(ExitPool + requests/httpx),覆盖了健康检查、故障转移和连接池复用。但在实际业务中,越来越多的场景用 asyncio 做高并发采集或批量接口调用——异步事件循环下多出口的管理方式和同步场景完全不同:单线程

Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换
Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换

写在前面:为什么静态出口 IP 不是"买了就行"不少团队在引入静态出口 IP 产品时,第一反应往往是:“地址配上去,这事就算完了。”可真到了真实业务里,静态出口 IP 真正能体现价值的地方,往往不在分配这一步,而在分配之后怎么管:地址有没有漂移,质量是否达标,某一条线路突然不可用时怎么切换,连接层又

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。