当前位置:

首页 > 编程开发 > 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

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。