数据结构是计算机存储、组织数据的方式,而排序与查找算法则是对这些数据进行高效操作的重要手段。不同的数据结构适用于不同的应用场景,配合相应的算法可以极大提升程序的性能。
常见数据结构分类:
-
线性结构
- 数据元素之间是一对一的线性关系。
- 典型代表:数组、链表、栈、队列。
- 特点:逻辑上连续,可顺序访问。
-
数组(Array)
- 连续内存空间存储相同类型的数据。
- 支持随机访问(O(1) 时间访问),但插入/删除效率低(O(n))。
- 是实现其他数据结构(如堆、哈希表)的基础。
-
树(Tree)
- 非线性结构,层次化关系(一对多)。
- 常见类型:二叉树、二叉搜索树(BST)、平衡二叉树(AVL)、红黑树、堆、B树等。
- 应用:文件系统、数据库索引、优先队列(堆排序基础)。
-
图(Graph)
- 由顶点和边组成,表示多对多关系。
- 分为有向图、无向图、加权图等。
- 应用:社交网络、路径规划、推荐系统。
排序算法与对应数据结构的关系
| 算法 | 最佳时间复杂度 | 平均时间复杂度 | 数据结构基础 | 说明 |
|---|---|---|---|---|
| 冒泡排序 | O(n) | O(n²) | 数组 | 简单但效率低,适合教学 |
| 快速排序 | O(n log n) | O(n log n) | 数组 | 分治思想,实践中常用 |
| 归并排序 | O(n log n) | O(n log n) | 数组/链表 | 稳定排序,适合外部排序 |
| 堆排序 | O(n log n) | O(n log n) | 堆(完全二叉树) | 利用堆结构维护最大/最小值 |
| 计数排序 | O(n + k) | O(n + k) | 数组(计数桶) | 适用于整数且范围小的情况 |
查找算法与数据结构的关系
| 算法 | 时间复杂度 | 所需数据结构 | 说明 |
|---|---|---|---|
| 顺序查找 | O(n) | 任意(数组、链表) | 无需有序 |
| 二分查找 | O(log n) | 有序数组 | 要求数据有序,支持随机访问 |
| 二叉搜索树查找 | 平均 O(log n),最坏 O(n) | 二叉搜索树 | 动态插入删除,中序遍历有序 |
| 哈希查找 | 平均 O(1),最坏 O(n) | 哈希表 | 通过哈希函数直接定位 |
示例代码:二分查找(基于有序数组)
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid # 返回索引
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 未找到
二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树结构,它满足以下性质:
- 对于任意节点,其左子树中所有节点的值都小于该节点的值;
- 其右子树中所有节点的值都大于该节点的值;
- 左右子树也分别是二叉搜索树。
这一特性使得 插入、查找、删除 操作可以在 O(log n) 时间内完成(在树平衡的情况下),非常适合处理动态数据集合。
1. 查找操作(Search)
从根节点开始比较:
- 如果目标值等于当前节点 → 找到
- 小于当前节点 → 进入左子树
- 大于当前节点 → 进入右子树
class TreeNode:
def __init__(self, val=0):
self.val = val
self.left = None
self.right = None
def search_bst(root, target):
if not root or root.val == target:
return root
if target < root.val:
return search_bst(root.left, target)
else:
return search_bst(root.right, target)
2. 插入操作(Insert)
找到合适的“空位”插入新节点。同样是基于比较来决定路径。
def insert_bst(root, val):
if not root:
return TreeNode(val)
if val < root.val:
root.left = insert_bst(root.left, val)
elif val > root.val:
root.right = insert_bst(root.right, val)
# 若相等,不插入(避免重复)
return root
3. 完整示例:构建和使用 BST
# 构建一个简单的 BST
root = None
values = [50, 30, 70, 20, 40, 60, 80]
for v in values:
root = insert_bst(root, v)
# 查找
result = search_bst(root, 40)
print("Found:" if result else "Not found")
性能分析
| 操作 | 平均时间复杂度 | 最坏时间复杂度 | 条件 |
|---|---|---|---|
| 查找 | O(log n) | O(n) | 最坏情况是树退化为链表(如按顺序插入) |
| 插入 | O(log n) | O(n) | 同上 |
| 删除 | O(log n) | O(n) | 需要先查找再调整结构 |
⚠️ 为了防止退化,可使用 平衡二叉搜索树(如 AVL 树、红黑树),自动维持高度平衡,保证 O(log n) 性能。
实际应用场景
- 动态符号表(编译器中变量管理)
- 数据库索引(B+树是其扩展)
- 关联容器:C++ 的
set/map,Java 的TreeSet/TreeMap - 实现优先队列或范围查询


4万+

被折叠的 条评论
为什么被折叠?



