Skip to content

顺序表(数组)

核心思想

顺序表的核心特点:

  • 逻辑顺序与物理顺序一致:第 i 个元素存储在第 i 个物理位置
  • 随机访问:通过起始地址 + 偏移量,O(1) 时间访问任意元素
  • 静态分配 vs 动态分配:静态数组大小固定,动态数组可扩容(但需要复制数据)

⚠️ 易错:动态扩容(如 C 的 realloc、Java ArrayList 的 grow)的均摊时间复杂度是 O(1),但单次扩容的时间复杂度是 O(n)(需要复制全部元素到新空间)。408 选择题可能问'顺序表插入的最坏时间复杂度',如果考虑扩容则是 O(n)。

数据元素在内存中的存储方式:

地址:  LOC(a₁)  LOC(a₁)+d  LOC(a₁)+2d  ...  LOC(a₁)+(n-1)d
元素:  a₁       a₂         a₃          ...  aₙ

其中 d 是每个元素占用的存储空间大小。

插入操作流程图

交互可视化

通过下方的交互动画,你可以逐步观察顺序表各操作的执行过程:

加载可视化中...

操作详解

插入操作

在位置 i 插入新元素时,需要将第 i 个及之后的所有元素依次后移一位,腾出位置。

关键步骤:

  1. 判断插入位置是否合法(1 ≤ i ≤ n+1)
  2. 判断存储空间是否已满
  3. 从最后一个元素开始,依次后移到第 i 个元素
  4. 将新元素放入位置 i
  5. 表长加 1

删除操作

删除位置 i 的元素时,需要将第 i+1 个及之后的所有元素依次前移一位,填补空位。

关键步骤:

  1. 判断删除位置是否合法(1 ≤ i ≤ n)
  2. 取出被删除的元素(可能需要返回)
  3. 从第 i+1 个元素开始,依次前移
  4. 表长减 1

按值查找

从第一个元素开始,逐个比较,直到找到目标值或遍历完整个表。

⚠️ 易错:顺序表的按值查找是 O(n),即使表是有序的也是 O(n)——除非你用折半查找。很多同学会混淆'顺序表上的顺序查找'和'有序顺序表上的折半查找'。

复杂度分析

操作时间复杂度说明
按位查找O(1)随机访问,直接计算地址
按值查找O(n)最坏需遍历整个表
插入O(n)平均移动 n/2 个元素
删除O(n)平均移动 (n-1)/2 个元素

⚠️ 易错:顺序表插入的平均移动次数是 n/2,不是 n。推导过程:假设在位置 1~n+1 等概率插入,在位置 i 插入需移动 n-i+1 个元素,平均移动 = Σ(n-i+1)/(n+1) = n/2。408 填空题常直接考这个结果。

空间复杂度:O(1),插入和删除操作只需常数级辅助空间。

考研高频考点

  • ⭐ 插入和删除的平均移动次数计算(选择题/填空题高频)
  • ⭐ 顺序表 vs 链表的优缺点对比(简答题必考)
  • ⭐ 随机访问特性及其原因(概念题)
  • 动态扩容的时间开销分析(偶尔考)
  • 顺序表的存储密度(= 1,对比链表)

相关知识

  • 顺序表 vs 链表的对比贯穿整个线性表章节:顺序表胜在随机访问 O(1),单链表胜在插入删除 O(1)(已知位置时)
  • 顺序表的有序版本支持折半查找,这是查找章节的核心算法
  • 队列的顺序存储本质上就是对顺序表的受限操作——栈只允许在一端插入删除,队列只允许一端插入另一端删除
  • 排序算法(如快速排序堆排序)的前提就是数据存储在顺序表中,因为需要随机访问

真题练习

相关真题(21题)

2026Q1选择题2分

顺序表操作:表头插入/删除必然移动元素,表尾操作不移动

2025Q1选择题2分

时间复杂度分析:外层循环终止条件 i²≤n,内层循环次数为 i,求总执行次数的量级

2025Q41综合题13分

算法设计:数组中选两个元素使乘积最大,从右向左遍历维护最大/最小值,要求 O(n)

2023Q1选择题2分

顺序表操作:有序顺序表各操作中哪个平均时间复杂度为 O(1)(随机访问)

2023Q3选择题2分

稀疏矩阵三元组表:除三元组外还需保存矩阵行数和列数

2022Q1选择题2分

时间复杂度分析:外层循环变量按 2^k 递增、内层执行 i 次,等比求和得 O(n)

2021Q3选择题2分

二维数组按行存储:已知首地址和元素大小求指定元素地址

2020Q1选择题2分

特殊矩阵存储:对称矩阵上三角按列优先存储的下标计算

2020Q41综合题8分

算法设计:三个升序数组中各取一个元素使三元组距离最小(三指针法)

2019Q1选择题2分

时间复杂度分析:循环次数与问题规模的关系,程序运行时间为 O(√n)

2018Q3选择题2分

对称矩阵存储:上三角按行优先存储计算指定元素的下标

2018Q41综合题15分

算法设计:求数组中最小的未出现的正整数(标记数组法)

2017Q1选择题2分

时间复杂度分析:循环迭代函数的执行次数为 O(√n)

2017Q3选择题2分

稀疏矩阵压缩存储:三元组表和十字链表的适用性

2016Q4选择题2分

三对角矩阵压缩存储:计算指定元素在一维数组中的下标

2014Q1选择题2分

时间复杂度:外层 O(log₂n) 内层 O(n) 的嵌套循环总复杂度 O(nlog₂n)

2013Q41综合题9分

算法设计:数组主元素查找(候选元素计数法,摩尔投票)

2012Q1选择题2分

递归算法时间复杂度:分析递归调用的总执行次数

2011Q1选择题2分

时间复杂度:循环变量按幂次增长的复杂度分析

2011Q42综合题13分

算法设计:两个等长升序序列的中位数(二分缩减法)

2010Q42综合题10分

算法设计:数组循环左移 p 位(三次逆置法)