数据结构 —— 手写排序算法

数据结构 —— 手写排序算法

  • 一、堆排序
  • 二、快速排序

能手撸堆排序和快速排序,相信你在面试中已经能应付大部分排序问题了。

一、堆排序

建堆算法在面试中非常常见,我曾经就遇到过。因此为避免踩坑,特此开记录帖。堆必须是一棵完全二叉树,分为

  • 大根堆。每个父节点元素 >= 子节点
  • 小根堆。每个父节点元素 <= 子节点
一、参考文章或视频链接
[1] 【【从堆的定义到优先队列、堆排序】 10分钟看懂必考的数据结构——堆】- bilibili
[2] 《算法》(第4版) - chapter 2.4 堆排序 - bilibili
# coding:utf-8
# @Time: 2024/1/5 下午9:10
# @Author: 键盘国治理专家
# @File: quick_sort.py
# @Description:# 大根堆建堆,然后交换到数组最末尾就是升序排序了
def heapify(arr, n, i):largest = i # 初始化最大值为当前位置ileft = 2*i + 1 # 左子节点right = 2*i + 2 # 右子节点#if left < n and arr[i] < arr[left]: # 左子节点存在且比当前位置大largest = left # 更新最大值为左子节点的位置if right < n and arr[largest] < arr[right] # 右子节点存在且比当前位置大largest = rightif largest != i: # 最大值的位置已经被改动了,不再等于开始时的i了,则需要将最大值上浮arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest) # 再递归重复此过程,堆交换后的子树继续堆化def heap_sort(arr):n = len(arr)# (1)构建最大堆:从最后一个非叶子节点开始,依次进行堆化,也就是自底向上建堆,可以看参考视频[2]。最后一个非叶子节点?这样理解,如果将叶子节点视作一棵树,那么孤零零的一个节点本身就是一个堆。所以不需要建堆,但这不意味着这些叶子节点在随后的建堆过程中不参与交换,只是不以这些叶子节点为中心进行建堆。for i in range(n//2 - 1, -1, -1):heapify(arr, n, i) # arr为建堆数组,n表示建堆范围为[0,n-1]共n个,i表示堆arr[i]元素进行调整建堆for i in range(n-1, -1, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0) # 对[0,i-1]的元素继续建堆if __name__ == '__main__':# 示例用法nums = [10, 80, 30, 90, 40, 50, 70, -123]print("排序前的数组为", nums)heap_sort(nums)print("排序后的数组:", nums)

二、快速排序

二、参考文章或视频链接
[1] 《快速排序——hoare版本+挖坑法+双指针法》- CSDN
[2] 【快速排序(双指针法)动画演示】- bilibili

快速排序重在轴点pivot的选择与交换过程上。

# coding:utf-8
# @Time: 2024/1/5 下午9:10
# @Author: 键盘国治理专家
# @File: quick_sort.py
# @Description:def quick_sort(nums, low, high):if low < high:# 找到轴的位置。这句话是说轴一旦确定了,就意味着这个元素已经被放置在数组的正确位置了,后面不会再变动,partition函数本身就带有排序性质的交换操作pivot = partition(nums, low, high)# print(arr)quick_sort(nums, low, pivot - 1)quick_sort(nums, pivot + 1, high)def partition(nums, low, high):# (1)最左边的元素被选为轴点pivot_index = lowwhile low < high:# (2)high从右往左遍历,直到找到一个比轴点小的数字,并交换while nums[high] > nums[pivot_index]:high -= 1if nums[pivot_index] > nums[high]:nums[pivot_index], nums[high] = nums[high], nums[pivot_index]pivot_index = high# (3)low从左往右遍历,直到找到一个比轴点大的数字,并交换while nums[low] < nums[pivot_index]:low += 1if nums[low] > nums[pivot_index]:nums[pivot_index], nums[low] = nums[low], nums[pivot_index]pivot_index = low# (4)返回轴点的最终位置return pivot_indexif __name__ == '__main__':nums = [10, 80, 30, 90, 40, 50, 70, -123]print("排序前的数组为", nums)quick_sort(nums, 0, len(nums) - 1)print("排序后的数组为", nums)

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

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

相关文章

Allegro如何进行四层板板层设计

Allegro如何进行四层板板层设计 板层设计说明 在进行多层板设计时我们画好PCB板框后&#xff0c;都要进行板层的设计。这里就以最简单的4层板为例为大家举例说明。 板层设置 点击“Setup”->“Cross Section Editor”如下图所示&#xff1a; 也可以直接点击工具栏进入…

java基于ssm框架的校园闲置物品交易平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本校园闲置物品交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

LeetCode-Z 字形变换(6)

题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往…

安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

python实现圆圈烟花_附完整源码【第21篇—python过新年】

文章目录 前言效果图&#xff08;动态&#xff09;完整代码代码讲解总结寄语 前言 烟花是一种庆祝、欢庆或庆典活动中常见的美丽表现&#xff0c;它们以多彩的光芒和炫丽的形状为人们带来欢乐和惊喜。在这个项目中&#xff0c;我们将使用Python编程语言创建一个简单而有趣的程…

Pytest的测试报告——Allure

一、html-report测试报告 html-report测试报告。是pytest下基本的测试报告。要使用pytest-html测试报告&#xff0c;就要确保python版本在3.6及以上即可。本身pytest所提供的测试结果汇总&#xff0c;是基于控制台的文本输出形式。 pytest-html是基于HTML格式实现的测试报告的…

无心剑汉英双语诗《一亩三分地》

一亩三分地 My Small World 二十四年世事变幻 拨号上网曾争分夺秒 如今不限流量肆意冲浪 大数据&#xff0c;云计算&#xff0c;人工智能 洗刷着世间各行各业 周围人&#xff0c;生活不断升级 房子&#xff0c;车子&#xff0c;妻子…… 换了一茬又一茬 洋溢着自豪的表情 而我…

[NOIP2014 提高组] 生活大爆炸版石头剪刀布#洛谷

题目背景 NOIP2014 提高组 D1T1 题目描述 石头剪刀布是常见的猜拳游戏&#xff1a;石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统…

【Python_PyQtGraph 学习笔记(目录)】

【Python_PyQtGraph 学习笔记&#xff08;目录&#xff09;】 本专栏介绍如何使用 PyQtGraph 进行绘图操作&#xff0c;PyQtGraph 是基于 Qt 的纯 Python 库&#xff0c;如果使用 pyqt 进行图形界面开发&#xff0c;PyQtGraph 是很好的选择。 下面是专栏的目录汇总&#xff1a;…

无心剑七绝《未晚斋》

七绝未晚斋 倏忽半世莫伤怀 醉爱夕阳未晚斋 汉韵唐风情不尽 东华曼舞咏云台 2024年1月6日 新韵四开平韵 《未晚斋》这首诗&#xff0c;作者无心剑以其独特的笔触&#xff0c;描绘出了一幅宁静、淡雅的画面。诗中表达了对生活的热爱和对美好时光的珍惜。 首句“倏忽半世莫伤…

浏览器渲染原理(面试重点)

一、浏览器是如何渲染页面的 常见的简洁答案&#xff1a; 浏览器内核拿到内容后&#xff0c;渲染流程大致如下&#xff1a;解析HTML&#xff0c;构建Dom树&#xff1b;解析CSS&#xff0c;构建Render树&#xff1b;&#xff08;将CSS代码解析成树形的数据结构&#xff0c;与D…

使用nsight system 分析python进程

有时候我们的推理引擎是通过python脚本调用的&#xff0c;比如&#xff1a; python脚本调用TensorRT engine进行推理。 如果我们想用nsight system 分析性能&#xff0c;该怎么搞呢&#xff1f; 方法如下&#xff1a; 首先直接nsys profile 后面跟要执行的python命令就行 $…

一个vue3的tree组件

https://download.csdn.net/download/weixin_41012767/88709466

lldb in android studio

命令 n 单步s 进入函数, step intofini 函数返回, step outc 继续执行bt 显示调用栈, 标记*的行, 为当前帧(函数)frame info 显示栈当前所在的当前帧frame select [数字] 在当前栈中选择某个帧var 显示所有局部变量dis 显示汇编, 箭头位置为执行位置ni 汇编单步si 汇编进入函数…

c# vb.net检测字符串是否匹配一组相似度数组input Like

VB.NET 检测字符串是否符合一个数组中的多个like条件&#xff0c;有没有最简单的函数&#xff1f; 在VB.NET中&#xff0c;可以使用Enumerable.Any方法结合String.Like方法来检测一个字符串是否符合一个数组中的多个LIKE条件。Enumerable.Any方法用于确定序列中的任何元素是否…

java SSM社区文化服务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM社区文化服务管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系统主…

Mac环境下Parallels Desktop 19的安装和使用

为了后续构建漏洞靶场和渗透测试环境&#xff0c;我们需要提前准备好几套与宿主机隔离的工作环境&#xff08;Windows、Linux等&#xff09;&#xff0c;在Mac上最常用的就是Paralles Desktop&#xff08;PD&#xff09;工具了&#xff0c;当前最新版本为19。接下来介绍如何安装…

Http与Tcp协议的原理以及应用

OSI七层模型和相关协议 七层模型从上到下如下所示&#xff1a; 应用层&#xff1a;负责应用之间的通信&#xff0c;处理请求和响应的具体格式表示层&#xff1a;对于数据格式进行处理会话层&#xff1a;负责建立和断开通信连接&#xff0c;传输层&#xff1a;负责建立端口之间…

python开发案例教程-清华大学出版社(张基温)答案(4.3)

练习 4.1 1. 判断题 判断下列描述的对错。 &#xff08;1&#xff09;子类是父类的子集。 &#xff08; &#xff09; &#xff08;2&#xff09;父类中非私密的方法能够被子类覆盖。 &#xff08; &#xff09; &#xff08;3&#xff09;子类能够…

java distinct 无法为泛型去重

针对distinct无法为List<User>之类的去重。 所以这里简单说一下方案。 本质上是重写对象的equals方法。 但是这里有一个偷懒的方式。 就是直接使用Data (来自Lombok的注解) 因为Data 一样会重写equals 和 hashcode方法。 所以&#xff0c;直接使用Data来代替get;se…