This commit is contained in:
2026-01-22 21:43:03 +08:00
parent 1398ae9e17
commit 84fd6d7a92
3 changed files with 389 additions and 1 deletions
+59 -1
View File
@@ -62,4 +62,62 @@ Windows控制台设置为UTF-8;提示输入n、m与每条边x、y、z;运行
时间与空间复杂度
时间:O(n²) 选择与松弛;空间:邻接矩阵O(n²),辅助数组O(n)。
可能扩展
改为邻接表+最小堆实现,将复杂度优化为O(m log n);统一输出为OJ格式仅输出数值或-1;增加输入范围校验与路径重建输出。
改为邻接表+最小堆实现,将复杂度优化为O(m log n);统一输出为OJ格式仅输出数值或-1;增加输入范围校验与路径重建输出。
exercise/查找.c 实验分析
功能描述
读取整数个数n与n个整数,复制为sortedArr并用带索引的冒泡排序Bubble_Sort_With_Index排序,同时维护indexArr将排序后位置映射到原数组索引。打印排序结果。随后循环交互读取要查找的整数target与查找方法choice,支持:线性查找、二分查找(在有序数组上)、分块查找(在有序数组上)以及二叉搜索树查找。所有方法统一返回原数组中的索引;二分与分块通过indexArr映射,二叉树通过节点的idx返回。提供“退出程序”选项。
数据结构
数组:nums[n]原始数据;sortedArr[n]排序副本;indexArr[n]排序位置到原索引的映射。
二叉搜索树:TreeNode { int val; int idx; TreeNode* left; TreeNode* right; }。
常量:MAX为输入规模上限(100000)。
辅助函数
Linear_Search(arr, size, target):顺序扫描比较。
Binary_Search(arr, size, target):在有序数组中二分定位并返回位置。
Block_Search(arr, size, target):按块大小sqrt(size)定位块,块内线性扫描。
Bubble_Sort_With_Index(arr, index, size):冒泡排序,交换元素同时交换index,实现稳定排序与原索引映射。
BST_new/BST_insert/BST_free/BST_Search:构建与查找二叉搜索树,查找返回节点idx(原数组索引)。
核心算法
线性查找:从左到右逐项比较。
二分查找:每轮折半选中点,比较后缩小区间。
分块查找:按块扫描,先用块尾与目标比较确定块,再在块内线性查找。
二叉搜索树查找:按值大小关系在树上左/右移动查找。
预排序:稳定冒泡排序,为二分/分块提供有序数据并维护indexArr以统一索引语义。
初始化与交互
Windows控制台设置为UTF-8。
读取n与n个整数,完成排序并打印有序数组。
循环读取target与choice,按菜单执行查找并输出结果;选择5退出程序。
输入与输出
输入:第一行n;随后读入n个整数;之后循环读入查询值与方法选择。
输出:先打印排序后的数组;每次查询输出“找到了,目标元素的索引为:X”或“未找到目标元素。”。
代码特点
统一索引语义:二分与分块通过indexArr映射回原索引;BST节点直接保存idx。
稳定排序:仅在arr[j] > arr[j+1]时交换,保持相等元素相对次序。
使用C99变长数组,简化输入规模驱动的存储。
BST内存释放完整,避免泄漏;菜单交互支持多次查询与退出。
边界与异常处理
校验n在[1..MAX]范围内。
二分与分块依赖有序数组,程序已在进入查找前完成排序。
BST不平衡,最坏情况下退化为链表;重复值只插入第一次出现的节点,查找返回该值的首次出现索引。
基本输入未做范围与非法字符的深度校验。
时间与空间复杂度
预处理排序:Bubble_Sort_With_Index时间O(n²),额外空间O(n)用于indexArr。
线性查找:时间O(n),空间O(1)。
二分查找:时间O(log n),空间O(1);返回某一匹配位置的原索引(不保证最左)。
分块查找:时间O(√n)(定位块O(√n)+块内线性扫描O(√n)),空间O(1);通常返回该块内第一个匹配的原索引。
二叉搜索树查找:平均时间O(log n),最坏O(n);空间O(n)(节点)。
整体空间:数组O(n)BST O(n)。
可能扩展
将预排序替换为快速排序或qsort,将预处理复杂度优化为O(n log n)。
使用平衡BST或哈希表提高查找性能与一致性;二分查找改为返回最左/最右匹配以满足特定需求。
增加输入范围校验、异常处理与批量查询支持。