小孩也能看懂的算法笔记,排序day3-图解快速排序内存流转
算法的时间是怎么得出的计算机执行所有算法时都在重复取数据运算算完存回去。算法的时间复杂度就是计算机读取数据运算算完再存回去的次数。还记得为什么要先了解数据结构吗小孩能看懂的算法笔记首篇那数据在存储中是怎么变化的数据结构的栈和堆在内存中长啥样呢存储层级内存缓存寄存器在内存够用时要处理的全部数据存在内存RAM内部存储数据流转从RAM→缓存→寄存器。内存缓存寄存器存取速度不同内存最慢寄存器最快所以倾向尽量把数据让速度更快的寄存器和缓存少访问低速的内存。又由于寄存器最快但容量极小(几百字节)而内存容量最大(GB)读取数据时是从内存按需少量多次地拿局部数据。内存不够用的情况先不赘述。下面展示原地快速排序内存够用的流转过程。原地快速排序In-place QuickSort排序过程中没有辅助数组就叫原地快速排序。原地快速排序步骤选基准元素把数组分区成一组大的一组小的分别递归排好了接起来。栈和堆在内存中什么样操作系统和程序运行时将内存逻辑上划分为不同区域包括“栈Stack”和“堆Heap”和其他。栈Stack是一块连续的内存区域专门用于存储函数调用时的局部变量、参数、返回地址等。由编译器自动管理规则是自动清理后进先出LIFO。分配/释放函数调用时其局部变量如快速排序中的指针i、j被“压入”栈顶图里把栈顶放下面了注意看图步骤22最底下是栈帧1往上依次是栈帧23等。函数返回时这些变量被自动“弹出”释放。速度极快。Winndows和Linux地址都从高地址FEF1向低地址FEE1增长。大小较小且固定例如几MB由操作系统或编译器预设。如果递归太深如快速排序最坏情况可能导致栈溢出Stack Overflow。堆Heap是另一块内存区域用于动态内存分配如malloc、new。由程序员手动管理或由垃圾回收器管理更灵活但也更复杂分配/释放分配时在堆中找到一块足够大的空闲内存释放时需要显式调用free或delete。地址空间不连续通过指针链接。大小远大于栈通常只受系统可用物理内存和虚拟内存限制。Python 代码示例以下是一个完整、可运行的 Python 代码示例演示了原地快速排序In-place Quicksort算法。代码包含了详细的注释并指出了关键变量如指针i,j在内存中的可能位置以呼应前文对存储层级的讨论。defquicksort_inplace(arr,low,high): 原地快速排序的主递归函数。 参数: arr: 待排序的列表Python list在内存中连续存储。 low: 当前子数组的起始索引左边界。 high: 当前子数组的结束索引右边界。 iflowhigh:# 分区操作返回基准元素的最终位置pivot_indexpartition(arr,low,high)# 递归排序左半部分 (low 到 pivot_index-1)quicksort_inplace(arr,low,pivot_index-1)# 递归排序右半部分 (pivot_index1 到 high)quicksort_inplace(arr,pivot_index1,high)defpartition(arr,low,high): 分区函数选取基准元素并将数组重新排列使得基准左侧元素都小于等于基准右侧元素都大于基准。 返回基准元素的最终索引位置。 注意指针变量 i 和 j 是函数的局部变量。 在理想情况下编译器/解释器会尝试将它们存储在快速的 CPU 寄存器中。 如果寄存器不足或需要取地址它们则会被分配在函数的栈帧RAM 中的栈区域中。 # 选择最右侧的元素作为基准 (pivot)pivotarr[high]# i 指针指向“小于等于基准”区域的最后一个元素的下一个位置。# 初始时这个区域为空所以 i 指向 low。ilow-1# j 指针遍历从 low 到 high-1 的所有元素。forjinrange(low,high):# 如果当前元素 arr[j] 小于等于基准值ifarr[j]pivot:# 扩展“小于等于基准”的区域i 右移一位i1# 将 arr[j] 交换到该区域内arr[i],arr[j]arr[j],arr[i]# 循环结束后所有 pivot 的元素都在 arr[low..i] 中# 所有 pivot 的元素都在 arr[i1..high-1] 中# 将基准元素 pivot (arr[high]) 交换到正确位置 (i1)arr[i1],arr[high]arr[high],arr[i1]# 返回基准元素的最终索引returni1defprint_array_with_memory_view(arr,description): 辅助函数打印数组及其内存地址视图模拟。 用于直观展示数组元素在内存中的连续存储。 print(f\n{description})print(索引: ,end)foridxinrange(len(arr)):print(f{idx:4},end )print(\n值 : ,end)forvalinarr:print(f{val:4},end )print()# 主程序演示排序过程 if__name____main__:# 1. 初始化一个待排序的数组original_array[38,27,43,9,15,82,52]print( 原地快速排序演示 )print_array_with_memory_view(original_array,排序前数组:)# 2. 创建数组副本用于排序保持原数组不变以便对比array_to_sortoriginal_array.copy()# 3. 调用原地快速排序函数quicksort_inplace(array_to_sort,0,len(array_to_sort)-1)# 4. 打印排序结果print_array_with_memory_view(array_to_sort,排序后数组:)# 5. 验证排序结果print(f\n验证: 数组是否已排序{array_to_sortsorted(original_array)})# 6. 解释与存储层级的关联print(\n*50)print(【代码与存储层级的关联说明】)print(1. 数组 arr: 存储在内存(RAM)的连续区域排序过程直接在此区域交换元素符合原地定义。)print(2. 指针 i, j: 函数局部变量。)print( - 理想情况: 由编译器分配到 CPU 寄存器访问延迟约 0.5 纳秒最快。)print( - 寄存器不足时: 存储在函数栈帧RAM 中的栈区域访问需经过缓存或直接读内存。)print(3. 递归调用 quicksort_inplace: 每次调用产生一个栈帧存储参数 low/high 和返回地址。)print( 递归深度 O(log n) 决定了栈空间的使用量这也是算法空间复杂度为 O(log n) 的原因。)print(4. 缓存友好性: 由于数组内存连续分区操作顺序访问元素有利于缓存行(Cache Line)加载)print( 提高缓存命中率从而提升速度。)运行结果示例 原地快速排序演示 排序前数组: 索引: 0 1 2 3 4 5 6 值 : 38 27 43 9 15 82 52 地址: 0x1000 0x1004 0x1008 0x100C 0x1010 0x1014 0x1018 排序后数组: 索引: 0 1 2 3 4 5 6 值 : 9 15 27 38 43 52 82 地址: 0x1000 0x1004 0x1008 0x100C 0x1010 0x1014 0x1018 验证: 数组是否已排序 True 【代码与存储层级的关联说明】 1. 数组 arr: 存储在内存(RAM)的连续区域排序过程直接在此区域交换元素符合原地定义。因此每个基准元素对比过程中每层空间复杂度一直是O(1)最后递归了O(logn)层总空间复杂度为O(1)*O(logn)即O(logn)。 2. 指针 i, j: 函数局部变量。 - 理想情况: 由编译器分配到 CPU 寄存器访问延迟约 0.5 纳秒最快。 - 寄存器不足时: 存储在函数栈帧RAM 中的栈区域访问需经过缓存或直接读内存。 3. 递归调用 quicksort_inplace: 每次调用产生一个栈帧存储参数 low/high 和返回地址。 递归深度 O(log n) 决定了栈空间的使用量这也是算法空间复杂度为 O(log n) 的原因。 4. 缓存友好性: 由于数组内存连续分区操作顺序访问元素有利于缓存行(Cache Line)加载 提高缓存命中率从而提升速度。如何运行将上述代码复制到一个.py文件例如quicksort_demo.py。在终端或命令行中执行python quicksort_demo.py你将看到排序前后的数组、模拟的内存地址视图以及算法与存储层级的关联分析。现在指针存储寄存器/栈、栈帧与递归、内存连续性与缓存这些概念有没有变清晰呢这是fivebliss

相关新闻

使用Xilinx FPGA完成HDMI LOOPBACK回环显示设计(五)

使用Xilinx FPGA完成HDMI LOOPBACK回环显示设计(五)

[5]phsaligner模块<1>此模块通过输出IDELAY和ISERESE两个模块的控制信号,完成phase alignment.<2>状态机的运行是本模块的核心.这一部分完全应用1-3-(4)-[2]小节介绍的思路.<3>在没有接收到control token时,首先尝试bitslip操作.尝试过所有的bitslip后,再进行…

2026/7/26 23:45:44 阅读更多 →
Godot 4集成Steam网络:基于GDExtension的P2P联机方案

Godot 4集成Steam网络:基于GDExtension的P2P联机方案

1. 项目概述&#xff1a;为什么要在Godot 4里整合Steam网络&#xff1f;如果你正在用Godot 4开发一款PC或主机平台的多人游戏&#xff0c;并且希望它能上架Steam&#xff0c;那么绕不开的一个核心问题就是&#xff1a;如何让玩家通过Steam的好友系统轻松地联机&#xff1f;Godo…

2026/7/26 23:44:43 阅读更多 →
JMeter性能压测实战:如何配置业务请求比例模拟真实流量模型

JMeter性能压测实战:如何配置业务请求比例模拟真实流量模型

1. 项目概述&#xff1a;为什么需要配置业务请求比例&#xff1f;做性能压测的朋友&#xff0c;尤其是刚接触Jmeter的&#xff0c;可能都经历过这个阶段&#xff1a;照着教程&#xff0c;吭哧吭哧地写好了几个接口的脚本&#xff0c;然后设置好线程数、循环次数&#xff0c;一运…

2026/7/26 23:44:43 阅读更多 →

最新新闻

深度解析R3nzSkin:英雄联盟皮肤修改器的技术架构与内核级反作弊对抗实战指南

深度解析R3nzSkin:英雄联盟皮肤修改器的技术架构与内核级反作弊对抗实战指南

深度解析R3nzSkin&#xff1a;英雄联盟皮肤修改器的技术架构与内核级反作弊对抗实战指南 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin 在游戏修改工具与反作弊系统的永恒博弈中&#xff…

2026/7/27 0:03:56 阅读更多 →
告别枯燥刷本!三月七小助手让星穹铁道游戏时间减少80%

告别枯燥刷本!三月七小助手让星穹铁道游戏时间减少80%

告别枯燥刷本&#xff01;三月七小助手让星穹铁道游戏时间减少80% 【免费下载链接】March7thAssistant 崩坏&#xff1a;星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否已经厌倦了每天重复刷材料、清体力的机械操作…

2026/7/27 0:03:56 阅读更多 →
剪映AI音频分离功能即将下线?内部消息证实:6月起全面接入火山引擎ASR-AI架构(附迁移保底方案)

剪映AI音频分离功能即将下线?内部消息证实:6月起全面接入火山引擎ASR-AI架构(附迁移保底方案)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;剪映AI音频分离功能即将下线&#xff1f;内部消息证实&#xff1a;6月起全面接入火山引擎ASR-AI架构&#xff08;附迁移保底方案&#xff09; 功能变更背景与时间节点确认 据字节跳动内部技术通告&…

2026/7/27 0:03:56 阅读更多 →
【可灵多镜头短片制作终极指南】:20年影像工程师亲授3步实现电影级分镜调度与无缝转场

【可灵多镜头短片制作终极指南】:20年影像工程师亲授3步实现电影级分镜调度与无缝转场

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;可灵多镜头短片制作的核心理念与技术演进 可灵&#xff08;Kling&#xff09;作为新一代AI原生视频生成模型&#xff0c;其多镜头短片能力突破了传统单帧/单镜头生成范式&#xff0c;转向以叙事逻辑驱动的时…

2026/7/27 0:03:56 阅读更多 →
优启通3.7修改版:深度优化的PE系统维护工具

优启通3.7修改版:深度优化的PE系统维护工具

1. 项目概述今天要跟大家分享的是一个经过深度优化的PE工具——优启通3.7&#xff08;2025修改版&#xff09;。这个版本是在原版基础上进行了大量功能增强和兼容性改进的12月最新版本&#xff0c;特别适合系统维护人员和电脑爱好者使用。作为一个长期从事IT运维的老兵&#xf…

2026/7/27 0:03:56 阅读更多 →
Android 串口底层基础:USB 串口、RS485/232 驱动识别、串口通信框架入门

Android 串口底层基础:USB 串口、RS485/232 驱动识别、串口通信框架入门

Android 串口底层基础&#xff1a;USB 串口、RS485/232 驱动识别、串口通信框架入门工控板子要跟传感器、继电器、PLC 对话&#xff0c;串口就是那根"嗓子"。搞不定串口&#xff0c;工控项目等于哑巴。一、串口通信基础 串口通信是最经典的设备间通信方式&#xff0c…

2026/7/27 0:02:56 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述&#xff1a;从寄存器手册到实战指南 如果你手头有一份类似德州仪器&#xff08;TI&#xff09;TMS320x240xA系列DSP的SPI模块技术手册&#xff0c;看着里面密密麻麻的寄存器位定义、时序图和公式&#xff0c;是不是感觉头大&#xff1f;这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻