8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析
一、简单选择排序
1.1 定义与核心思想
简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是:
- 每趟选择:从待排序序列中选择最小(或最大)的元素,与当前位置的元素交换。
- 逐步构建有序序列:经过 n − 1 n-1 n−1趟选择,最终得到完全有序序列。
时间复杂度:
- 最好/最坏/平均情况均为 O ( n 2 ) O(n^2) O(n2)。
空间复杂度: O ( 1 ) O(1) O(1)(原地排序)。
稳定性:不稳定(相同元素可能交换位置)。
1.2 算法实现与易错点
1.2.1 代码实现
C语言实现:
void selectSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int min_idx = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[min_idx]) {min_idx = j;}}if (min_idx != i) {int temp = arr[i];arr[i] = arr[min_idx];arr[min_idx] = temp;}}
}
Python实现:
def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]return arr
1.2.2 易错点
- 交换逻辑:需在内层循环结束后进行交换,避免重复交换。
- 边界条件:内层循环应遍历
i+1到n-1,否则可能漏选元素。 - 稳定性:相同元素交换会破坏稳定性,需特别注意。
1.2.3 真题与模拟题
2023年408真题:
简单选择排序的最坏时间复杂度为( )。
A. O ( n ) O(n) O(n)
B. O ( n log n ) O(n\log n) O(nlogn)
C. O ( n 2 ) O(n^2) O(n2)
D. O ( 1 ) O(1) O(1)
答案:C
解析:无论数据初始状态如何,比较次数始终为 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1)。
模拟题1:
题目:对数组[5, 3, 8, 6](@ref)进行简单选择排序,写出第三趟排序后的结果。
解答:
第一趟:3,5,8,6 → 比较3次
第二趟:3,5,8,6 → 比较2次
第三趟:3,5,6,8 → 比较1次
最终结果:3,5,6,8
二、堆排序
2.1 定义与核心思想
堆排序(Heap Sort)是一种树形选择排序算法,利用堆结构高效选择极值。其核心步骤为:
- 建堆:将无序数组调整为堆结构(大根堆或小根堆)。
- 调整堆:反复交换堆顶元素与末尾元素,并重新调整堆,最终得到有序序列。
时间复杂度:
- 建堆: O ( n ) O(n) O(n)
- 调整堆: O ( n log n ) O(n\log n) O(nlogn)
- 总体: O ( n log n ) O(n\log n) O(nlogn)。
空间复杂度: O ( 1 ) O(1) O(1)(原地排序)。
稳定性:不稳定(相同元素可能交换位置)。
2.2 堆排序的实现与难点
2.2.1 堆的结构与调整
堆的定义:
- 大根堆:任意节点的值均不大于其子节点(根节点为最大值)。
- 小根堆:任意节点的值均不小于其子节点(根节点为最小值)。
调整堆(Heapify):
从根节点开始,向下调整以维持堆性质。关键步骤:
- 比较左右子节点,找出较大(大根堆)或较小(小根堆)者。
- 若根节点小于子节点,交换并递归调整子树。
代码示例:
void heapify(int arr[], int n, int i) {int largest = i;int left = 2*i + 1;int right = 2*i + 2;if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest != i) {swap(&arr[i], &arr[largest]);heapify(arr, n, largest);}
}
2.2.2 建堆过程
建堆需从最后一个非叶子节点开始,逐步向上调整。例如,数组长度为 n n n,最后一个非叶子节点索引为 ⌊ n 2 ⌋ − 1 \lfloor \frac{n}{2} \rfloor - 1 ⌊2n⌋−1。
示例:
数组[49, 38, 65, 97, 76, 13, 27, 49](@ref)建堆过程:
- 从索引3(元素97)开始调整,无需交换。
- 索引2(元素65)调整为大根堆,子节点38和76均小于65,无需调整。
- 索引1(元素38)调整为大根堆,子节点27和49均小于38,无需调整。
- 索引0(元素49)调整为大根堆,子节点38和65中65较大,交换后继续调整。
2.2.3 真题与模拟题
2024年408真题:
堆排序中,构建初始堆时需从最后一个非叶子节点开始调整,其索引为( )。
A. ⌊ n / 2 ⌋ \lfloor n/2 \rfloor ⌊n/2⌋
B. ⌈ n / 2 ⌉ \lceil n/2 \rceil ⌈n/2⌉
C. n − 1 n-1 n−1
D. n n n
答案:A
解析:最后一个非叶子节点索引为 ⌊ n 2 ⌋ − 1 \lfloor \frac{n}{2} \rfloor - 1 ⌊2n⌋−1,向上调整至根节点。
模拟题2:
题目:对数组[12, 36, 24, 85, 47, 30, 53, 91](@ref)进行堆排序,写出建堆后的结果。
解答:
建堆后的大根堆:91,85,53,36,47,30,24,12
三、综合对比与优化策略
3.1 简单选择排序 vs 堆排序
| 特性 | 简单选择排序 | 堆排序 |
|---|---|---|
| 时间复杂度 | O ( n 2 ) O(n^2) O(n2) | O ( n log n ) O(n\log n) O(nlogn) |
| 空间复杂度 | O ( 1 ) O(1) O(1) | O ( 1 ) O(1) O(1) |
| 稳定性 | 不稳定 | 不稳定 |
| 适用场景 | 小规模数据或教学演示 | 大规模数据排序 |
3.2 堆排序的优化
- 三数取中法:选择首、尾、中间元素的中值作为基准,减少最坏情况概率。
- 小堆优化:对小数组(如长度<10)改用插入排序,减少递归开销。
四、真题与模拟题汇总
4.1 真题解析
2023年408算法题:
给定数组
[3, 6, 8, 10, 1, 2, 1](@ref),用堆排序算法写出第一趟调整后的堆结构。
答案:
调整后的大根堆:8,6,3,10,1,2,1
2024年408选择题:
堆排序的比较次数与( )无关。
A. 元素排列顺序
B. 表长
C. 关键字类型
D. 基准元素选择
答案:D
解析:基准元素仅影响交换次数,不影响比较次数。
4.2 模拟题
模拟题3:
题目:设计简单选择排序算法,对数组[9, 7, 5, 11, 12, 2, 14](@ref)进行排序,并计算比较次数。
解答:
比较次数:15次
最终结果:
模拟题4:
题目:对数组[5, 5, 5, 5, 5](@ref)进行堆排序,说明稳定性。
解答:
排序结果:
稳定性:不稳定(中间元素交换)
五、总结与建议
- 简单选择排序:适用于小规模数据或教学演示,优化空间有限。
- 堆排序:大规模数据首选,需掌握建堆和调整堆的细节。
- 实战技巧:
- 堆排序的
heapify函数是高频考点,需理解递归调整过程。 - 简单选择排序的交换次数优化可通过记录最小值位置实现。
- 堆排序的
相关文章:
8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是: 每趟选择:从待排序序列中选择最小(或最大&#x…...
C++中ShellExecute函数使用方法说明,如果一开始参数为隐藏,后面还能再显示出来吗
文章目录 一、ShellExecute基础用法函数原型关键参数 nShowCmd示例代码:启动程序并隐藏窗口 二、隐藏后能否重新显示窗口直接答案 三、实现隐藏后显示窗口的步骤1. 获取目标窗口句柄2. 显示窗口 四、完整流程示例五、注意事项六、总结 在C中使用ShellExecute函数时&…...
MySQL数据库精研之旅第五期:CRUD的趣味探索(上)
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、CRUD简介 二、Create新增 2.1. 语法 2.2. 示例 三、Retrieve检索 3.1. 语法 3.2. 示例 一、CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作:Create(创建)、Retrieve(检索…...
【文件上传】✈️大文件的上传服务器的简单实现
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时五分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&a…...
Windows DOS窗口12个命令
DOS 命令是指在 Windows 命令提示符(CMD)中使用的命令行工具,源于早期的 Disk Operating System。虽然现代 Windows 系统更多使用图形界面,但命令提示符仍然是测试人员的重要工具。测试人员通常需要执行文件操作、测试网络连接、监…...
AI加Python的文本数据情感分析流程效果展示与代码实现
本文所使用数据来自于梯田景区评价数据。 一、数据预处理 数据清洗 去除重复值、空值及无关字符(如表情符号、特殊符号等)。 提取中文文本,过滤非中文字符。 统一文本格式(如全角转半角、繁体转简体)。 中文分词与去停用词 使用 jieba 分词工具进行分词。 加载自定义词…...
Go语言手动内存对齐的四大场景与实践指南
Go语言手动内存对齐的四大场景与实践指南 引言:Go的内存对齐机制 Go语言通过编译器自动处理内存对齐问题,开发者通常无需关心底层细节。然而,在特定场景下,手动干预内存对齐是避免程序崩溃或数据错乱的必要操作。本文将深入探讨G…...
PDF多表格结构识别与跨表语义对齐:基于对抗迁移的鲁棒相似度度量模型
文章目录 一. 项目结构二.流程分析2.1 批处理器核心代码解析 三. 跨页表格相似度匹配原理3.1 表头内容相似度-特征向量归一化3.2 表头内容相似度-余弦相似度3.3 定时缓存清理 ocr扫描有其局限性。对于pdf文本类型这种pdfbox,aspose-pdf,spire直接提取文本…...
docker启动nacos+redis+seata
docker启动nacos 最新版本的nacos需要再启动的时候设置mysql的一些属性,【也可以先启动nacos,再到配置文件中找到application.yml设置mysql的一些属性】。 1.如果直接启动nacos设置的mysql我们需要确定两个容器的ip都是一样的。 查看mysql容器中的ip命令…...
从 select 到 epoll:拆解 I/O 多路复用的演进与实战
目录 一、引言:为什么需要 I/O 多路复用? 二、select 1.函数介绍 2.原理 3.样例代码 4.优缺点总结 三、poll 1.函数介绍 2.样例代码 3.优缺点总结 四、epoll 1.函数介绍 2.原理 3.LT和ET两种工作模式 4.优缺点总结 五、核心机制对比&…...
Go后端架构探索:从 MVC 到 DDD 的演进之路
Go语言 MVC 与 DDD 分层架构详细对比 MVC和DDD是后台开发两种流行的分层架构思想,MVC(Model-View-Controller)是一种设计模式,主要用于分离用户界面、业务逻辑和数据模型,便于分层解耦,而DDD(领…...
【力扣hot100题】(017)矩阵置零
还是挺简单的,使用哈希表记录需要置换的行列即可,这样就可以避免重复节省时间。 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {unordered_set<int> row;unordered_set<int> line;for(int i0;i&l…...
One Commander 3,文件管理新体验
One Commander 3 是一款集多功能于一体 Windows 10/11的文件管理工具,其设计目的在于为用户带来多元化的操作体验。这款工具通过支持多栏界面布局,让用户能够迅速且高效地组织和管理文件。此外,它还提供了多主题选项和多种图标集,…...
Ubuntu 下 nginx-1.24.0 源码分析
main 函数在 src\core\nginx.c int ngx_cdecl main(int argc, char *const *argv) {ngx_buf_t *b;ngx_log_t *log;ngx_uint_t i;ngx_cycle_t *cycle, init_cycle;ngx_conf_dump_t *cd;ngx_core_conf_t *ccf;ngx_debug_init();if (ngx_strerror_in…...
c# ftp上传下载 帮助类
工作中FTP的上传和下载还是很常用的。如下载打标数据,上传打标结果等。 这个类常用方法都有了:上传,下载,判断文件夹是否存在,创建文件夹,获取当前目录下文件列表(不包括文件夹) ,获取当前目录下文件列表(不包括文件夹) ,获取FTP文件列表(包括文件夹), 获取当前目…...
Java进阶——静态代理与动态代理
代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静…...
VS Code 中 .history`文件的来源与 .gitignore`的正确使用
引言 在使用 VS Code 进行 Git 版本控制时,有时会发现项目中多出一个 .history 目录,并被 Git 识别为未跟踪文件。本文将解释 .history 的来源,并提供 .gitignore 的正确配置方法,确保开发环境的整洁性。 1. .history 文件的来源…...
非手性分子发光有妙招:借液晶之力,实现高不对称圆偏振发光
*本文只做阅读笔记分享* 一、圆偏振发光研究背景与挑战 圆偏振发光(CPL)材料在3D显示、光电器件等领域大有用处,衡量它的一个重要指标是不对称发光因子(glum)。早期CPL材料的glum值低,限制了实际应用。为…...
解释器模式_行为型_GOF23
解释器模式 解释器模式(Interpreter Pattern)是一种行为型设计模式,核心思想是定义语言的文法规则,并构建一个解释器来解析和执行该语言中的表达式。它类似于“翻译器”——将符合特定语法规则的文本(如数学公式、脚本…...
OTN(Optical Transport Network)详解
OTN(光传送网)是一种基于**波分复用(WDM)**的大容量光传输技术,结合了SDH的运维管理优势和WDM的高带宽特性,广泛应用于骨干网、城域核心层及数据中心互联(DCI)。 1. OTN 的基本概念 …...
YOLOv8+ Deepsort+Pyqt5车速检测系统
该系统通过YOLOv8进行高效的目标检测与分割,结合DeepSORT算法完成目标的实时跟踪,并利用GPU加速技术提升处理速度。系统支持模块化设计,可导入其他权重文件以适应不同场景需求,同时提供自定义配置选项,如显示标签和保存…...
【干货】前端实现文件保存总结
⚠️⚠️文前推荐一下👉 前端必备工具推荐网站(图床、API和ChatAI、智能AI简历、AI思维导图神器等实用工具): 站点入口:http://luckycola.com.cn/ 前端实现文件保存实现总结 在Web开发中,文件下载是常见的交互需求。本文将系统总结前端实现文…...
并发编程之FutureTask.get()阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方案
FutureTask.get方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法 FutureTask.get()方法阻塞陷阱:深度解析线程池CPU飚高问题排查与解决方法1、情景复现1.1 线程池工作原理1.2 业务场景模拟1.3 运行结果1.4 发现问题:线程池没有被关闭1.…...
DGNN-YOLO:面向遮挡小目标的动态图神经网络检测与追踪方法解析
一、算法结构与核心贡献 1.1 文章结构 采用经典五段式结构: 引言:分析智能交通系统(ITS)中小目标检测与追踪的挑战,提出研究动机。相关工作:综述小目标检测(YOLO系列、Faster R-CNN)、目标追踪(SORT、Transformer)和图神经网络(GNN)的进展。方法论:提出DG…...
在Ubuntu中固定USB设备的串口号
获取设备信息 lsusb # 记录设备的Vendor ID和Product ID(例如:ID 0403:6001)# 获取详细属性(替换X和Y为实际设备号) udevadm info -a /dev/ttyUSBX 结果一般如下 创建udev规则文件 sudo gedit /etc/udev/rules.d/us…...
javaSE————文件IO(2)、
文件内容的读写——数据流 我们对于文件操作使用流对象Stream来操作,什么是流对象呢,水流是什么样的,想象一下,水流的流量是多种的,可以流100ml,也可以流1ml,流对象就和水流很像,我…...
前端常问的宏观“大”问题详解(二)
JS与TS选型 一、为什么选择 TypeScript 而不是 JavaScript? 1. 静态类型系统:核心优势 TypeScript 的静态类型检查能在 编译阶段 捕获类型错误(如变量类型不匹配、未定义属性等),显著减少运行时错误风险。例如&…...
[创业之路-343]:创业:一场认知重构与组织进化的双向奔赴
目录 前言:关键词: 一、重构企业认知框架: 1、认知框架的顶层设计——六大维度生态模型 2、认知重构的精密设计——五层结构化模型 第一层:战略层(脑) 第二层:运营层(躯干&…...
智慧电力:点亮未来能源世界的钥匙
在科技日新月异的今天,电力行业正经历着前所未有的变革。智慧电力,作为这一变革的核心驱动力,正逐步改变着我们对电力的认知和使用方式。它不仅是电力行业的一次技术革新,更是推动社会可持续发展、实现能源高效利用的重要途径。 智…...
架构师面试(二十三):负载均衡
问题 今天我们聊微服务相关的话题。 大中型微服务系统中,【负载均衡】是一个非常核心的组件;在微服务系统的不同位置对【负载均衡】进行了实现,下面说法正确的有哪几项? A. LVS 的负载均衡一般通过前置 F5 或是通过 VIP keepa…...
