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

news2024/10/7 16:20:49

前言

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

🍀作者简介:被吉师散养、喜欢前端、学过后端、练过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))

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

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

通过更小+基准+更大

重复拼接,来达到目的

首先来进行读取数据

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

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

吉师大一python算法第二天(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:]

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

screen-20230117-134554

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows系统上的小知识点集合(收藏更新)

1.开机自动运行 如果你写了一段代码或者脚本&#xff0c;甚至某个程序。希望在windows开机之后自动执行&#xff0c;可以按照以下方法操作 对于Windows系统&#xff0c;开机之后当所有的软件初始化完毕之后&#xff0c;会自动运行 C:\Users\&#xff08;你的用户名&#xff…

Elasticsearch入门—— Elasticsearch7.8.0版本索引操作

目录一、创建索引1.1、创建索引概述1.2、创建索引示例1.3、重复创建索引示例二、查看索引2.1、查看所有索引2.2、查看单个索引三、删除索引3.1、删除索引一、创建索引 1.1、创建索引概述 对比关系型数据库&#xff0c;创建索引就等同于创建数据库 1.2、创建索引示例 在 Pos…

matlab/simulink仿真数据的导出暨to workspace模块的使用

matlab/simulink仿真数据的导出 在用simulink仿真的时候&#xff0c;希望把数据导出&#xff0c;用其他软件进一步分析和处理&#xff0c;该如何做呢&#xff1f; 使用下面这个叫做to workspace的模块就可以实现 1 参数设置 把该模块拖出来。双击打开进行设置&#xff0c;会…

贪心策略(一)(选择排序、分割平衡串、买卖股票、跳跃游戏)

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。 贪心选择是指所求问题的整体最优解可以通过一系列…

4、Ubuntu20常用操作_文本编辑文件系统目录和文件操作用户管理和文件权限

Ubuntu系统操作 注销&#xff08;退出Linux系统&#xff09; 在每次使用完后&#xff0c;一定要进行注销&#xff08;或者说退出&#xff09;&#xff0c;以防他人通过你的帐号进入系统。 在Linux提示符下&#xff0c;运行exit命令&#xff0c;即可退出本次登录 或直接按组…

代码随想录刷题训练营第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

四数相加 看完题后的思路 首先想到了暴力解法,四重for循环,时间复杂度为0(n^4).接着往下想,四数相加不正好是(两数相加)(两数相加)吗,可以依次求出两数相加的结果存入hash表中 和-[下标1,下标2],然后再进行两数相加. 思路 上面的思路中,有两点疑问: (12)(34)(13)(24)吗? 1…

渗透测试基础入门【01】——测试流程(IPC$)

渗透测试基础入门【01】——测试流程&#xff08;IPC$&#xff09; 注意&#xff0c;攻击对方需要对方授权&#xff0c;本文章目的只为教学&#xff0c;不要拿去干违法的事 1 渗透测试流程 授权&#xff08;获取目标用户授权&#xff0c;否则是违法行为&#xff09;信息收集 …

【4 - 降维算法PCA和SVD - 原理部分】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

nacos注册源码分析

Nacos注册服务 cosumer启动的时候&#xff0c;从nacos server上读取指定服务名称的实例列表&#xff0c;缓存到本地内存中。 开启一个定时任务&#xff0c;每隔10s去nacos server上拉取服务列表 nacos的push机制&#xff1a; 通过心跳检测发现服务提供者出现心态超时的时候…

SpringCloud学习笔记 - 流控规则 - Sentinel

1. Sentinel流控规则简介 这里的流控指的是“流量控制”&#xff0c;进一步解释说明&#xff1a; 资源名&#xff1a;唯一名称&#xff0c;默认请求路径。 针对来源&#xff1a;Sentinel可以针对调用者进行限流&#xff0c;填写微服务名&#xff0c;默认default&#xff08;不…

爬虫解析模块(bs4,selenium)

bs4文档 from bs4 import BeautifulSoupBeautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。Beautiful Soup自动将输入文档转换为Unicode编码&#xff0c;输出文档转换为utf-8编码。 解析器 解析器使用方法优势劣势Python标准库BeautifulS…

Dubbo——入门介绍

目录1.概述1.1.什么是 Dubbo &#xff1f;1.2.Dubbo 架构2.Dubbo 快速入门2.1.Zookeeper 安装2.2.创建项目2.3.代码实现2.3.1.dubbo-service 模块2.3.2.dubbo-web 模块2.4.本地启动2.5.使用 Dubbo 实现 PRC2.5.1.修改 dubbo-service 模块2.5.2.修改 dubbo-web 模块2.5.3.启动 d…

可免费编辑 PDF 内容的 7 大 PDF 编辑工具

有时您可能希望编辑 PDF 文档中的敏感信息&#xff0c;例如财务帐号和 ID 号&#xff0c;以便在不泄露隐私的情况下共享 PDF。编辑 PDF 是从 PDF 中删除私有内容。使用PDF 编辑工具可以轻松完成编辑。市场上有这么多工具&#xff0c;您需要选择最好的一种。 7 大 PDF 编辑工具 …

data analysis and predict

data anlysis and predict 谢邀&#xff0c;本人正在崩溃和兴奋间反复横跳&#xff08;崩溃居多&#xff09;&#xff0c;anyway, 我心态超好的&#xff01;besides, 仅供个人学习查阅&#xff0c;不具任何参考价值&#xff01;&#xff01;&#xff01; &#xff08;小边不想努…

路由信息协议RIP

文章目录路由信息协议RIP一、Routing Information Protocol的定义二、RIP的基本工作过程三、“坏消息传播得慢”的问题四、总结路由信息协议RIP 一、Routing Information Protocol的定义 RIP是分布式的基于距离向量的路由选择协议 协议RIP的特点是&#xff1a; 仅和相邻路由…

Java数据结构(泛型)

1、集合框架 Java 集合框架Java Collection Framework &#xff0c;又被称为容器container &#xff0c;是定义在 java.util 包下的一组接口interfaces 和其实现类classes 。 其主要表现为将多个元素element 置于一个单元中&#xff0c;用于对这些元素进行快速、便捷的存储sto…

【XML了解】xml与hxml 标记语言学习

XML与HXML的区别 XML 被设计用来传输和存储数据&#xff0c;结构化、存储以及传输信息&#xff08;如&#xff1a;数据包&#xff09; XML 被设计用来传输和存储数据&#xff0c;其焦点是数据的内容 XML 标签没有被预定义, 需要自行定义标签 HTML 被设计用来表现和展示数据&…

数组常用方法总结 (7) :copyWithin / fill / reduce / reduceRight

copyWithin 将指定位置的元素复制到数组的其他位置。返回值为移动后数组。原始数组的内容会被改变&#xff0c;原始数组的长度不会改变。arr.copyWithin(index, startIndex, endIndex)第一个参数为&#xff0c;期望被复制的内容将要插入的位置。第二个参数为&#xff0c;数组中…

SpringBoot 参数接收只看这一篇文章就够了

好久没有写过接口了&#xff0c;最近在写一些基础接口&#xff0c;在写参数接口接收参数的时候居然想不起来&#xff0c;会有那么一丝丝的怀疑&#xff0c;虽然并不会影响编码&#xff0c;但是说明一个问题&#xff0c;没有系统的总结知识&#xff0c;没有温故知新&#xff0c;…

PMP真的有用吗?

作为一个考了PMP的前辈来说&#xff0c;是有用的。PMP 含金量&#xff0c;PMP有没有用&#xff0c;这类问题一直是大家关注的重点&#xff0c;知乎上几个相关问题热度也一直很高。友情提示一句&#xff1a;PMP 就是一个证书&#xff0c;能起到加分和门槛的作用&#xff0c;技术…