Python算法:三种高级排序的方法

简介: Python算法:三种高级排序的方法

前言


声明:本文所有动图来源为菜鸟教程


🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。


上一期说完了三种简单排序,这一期来说说三种高级排序方法


分别是


  • 快速排序
  • 希尔排序
  • 归并排序


1、快速排序


这个排序方法说起来和冒泡排序有点像,为什么这么说呢,咱先来看图

相对于上一期的简单排序而言,高级排序肯定就不是能一眼看出来了


不说废话了


这玩意分两步


第一步,快速排序首先需要的东西,是一个枢轴值,也就是基准


怎么说?


实际上就是,我选出来一个数作为基准


然后进行分割:比这个基准大的放在该基准的右边,比这个基准小的放在该基准的左边,和基准一样大的,放左右都行


第二步,将基准左/右侧的子序列进行递归排序


实例


def QuickSort(arr):
    if(len(arr)<2): #不用进行排序
        return arr
    else:
        pivot=arr[0]
        less=[i for i in arr[1:] if(i<=pivot)]
        great=[i for i in arr[1:] if(i>pivot)]
        return QuickSort(less)+[pivot]+QuickSort(great)
arr=list(map(int,input().split(' ')))
print("原始数据:",arr)
print("排序后的数据:",QuickSort(arr))

那么这里,我们并没有完全采用上述原理


而是使用重复二分的方式,将数据分为更大与更小两个列表


通过更小+基准+更大


重复拼接,来达到目的


首先来进行读取数据


然后调用函数,如果列表里只有一个元素或者没有元素,就不需要判断


否则,以第一个元素作为基准,分出比他大的和比他小的,分别放在两个列表中,进行拼接


https://www.bilibili.com/video/BV1wY4y1Z7Me?t=43.1


2、希尔排序


希尔排序其实不难,说白了就是插入排序plus,咱们可以很容易地理解


这个排序算法主要利用到了步长

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。


接下来直接看实例,并讲解


实例


nums = list(map(int,input().split(' ')))
def ShellSort(nums):
    step = len(nums)//2 #初始化增量为数组长度的一半
    while step > 0: #增量必须是大于0的整数
        for i in range(step,len(nums)):#遍历需要进行插入排序的数
            while i >= step and nums[i] < nums[i-step]: #对每组进行插入排序
                nums[i],nums[i-step] = nums[i-step],nums[i]
        step //= 2#增量缩小一半
    print(nums)
ShellSort(nums)

上图原地址 :秒懂算法3-希尔排序_哔哩哔哩_bilibili


按上图来解释,首先我们去步长/跨度


用列表整体长度整除2,上图中一共有九张牌,9//2就等于4,由于我们的循环是从step,也就是第四位开始的,所以我们要判断的条件是八万是否要小于七万。


不小于,不执行


i递增,到了二万,她所对应的是四万,小于,即换位


以此类推到最后一位


结束循环,后缩小步长,再来一遍,直到步长为一,整体排一遍


3、归并排序


基本思想:


  • 分割:递归地把当前序列平均分割成两半
  • 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)

这个算法可以说是只要理解快速排序,直接拿捏了


直接看算法

def merge(L,R):
    i, j = 0,0
    # 用于存放L与R的合并内容
    res = []
    while i < len(L) and j < len(R):
        if L[i] <= R[j]:
            res.append(L[i])
            i += 1
        else:
            res.append(R[j])
            j += 1
    res += R[j:] if i == len(L) else L[i:]
    return res
def merge_sort(List):
    length = len(List)
    if length <= 1:
        return List
    else:
        mid = length//2
        left = merge_sort(List[:mid])
        right = merge_sort(List[mid:])
        return merge(left,right)
List = list(map(int,input().split(' ' )))
print(merge_sort(List))

首先进行一个读取数据


调用函数merge_sort


该函数与上述快排相差无几,只不过是从中值开始分的


返回值时调用函数


创建一个新列表,如果左侧大于右侧,将左侧数据通过append放置末尾

res += R[j:] if i == len(L) else L[i:]

该语句负责将剩余的数据拼接到列表中


目录
相关文章
|
1天前
|
机器学习/深度学习 算法 数据可视化
Python 数据结构和算法实用指南(四)(4)
Python 数据结构和算法实用指南(四)
7 1
|
1天前
|
机器学习/深度学习 存储 算法
Python 数据结构和算法实用指南(四)(3)
Python 数据结构和算法实用指南(四)
12 1
|
1天前
|
存储 算法 搜索推荐
Python 数据结构和算法实用指南(四)(2)
Python 数据结构和算法实用指南(四)
8 0
|
1天前
|
存储 算法 Serverless
Python 数据结构和算法实用指南(四)(1)
Python 数据结构和算法实用指南(四)
11 0
|
1天前
|
存储 算法 搜索推荐
Python 数据结构和算法实用指南(三)(4)
Python 数据结构和算法实用指南(三)
9 1
|
1天前
|
存储 搜索推荐 算法
Python 数据结构和算法实用指南(三)(3)
Python 数据结构和算法实用指南(三)
9 1
|
1天前
|
存储 算法 前端开发
Python 数据结构和算法实用指南(三)(2)
Python 数据结构和算法实用指南(三)
8 1
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
1天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
7 1