跳过并跳转到主要内容

数组

数组是程序设计中最基础的数据结构,它把相同类型的数据按连续的内存位置有序存放,通过下标就能快速访问对应元素,便于批量存储与处理一组数据,但数组长度大多固定,插入删除操作效率相对较低。

数据结构1分钟阅读
数组数据结构示意图,展示从零开始的下标索引,每个索引对应一个数组元素。
数组数据结构示意图,展示从零开始的下标索引,每个索引对应一个数组元素。

数组(Array) 是计算机科学中最基础、最核心的线性数据结构(Linear Data Structure)。它用一块连续的内存空间,来存储一组具有相同类型的数据。

数组最核心的两大特点:内存连续分配存储元素类型完全相同

以 C++ 的int数组为例,int类型每个元素占用 4 字节。当定义整型数组时,全部元素会在内存里紧密相邻、依次排布。

示例:int arr[] = {11, 9, 17, 89, 1, 90, 19, 5, 3, 23, 43, 99},它在内存中的排布如下:

数组数据结构示意图,标注数组元素与下标索引,展示一组连续存储的数字
数组每一个元素拥有独立内存地址,地址间隔固定为 4 字节;下标从 0 开始,数组下标和内存地址一一对应。

因为数组在内存中是连续存放的,计算某个元素的物理内存地址非常高效:

Address(i)=BaseAddress+i×ElementSize\text{Address}(i) = \text{BaseAddress} + i \times \text{ElementSize}

  • BaseAddress\text{BaseAddress}:数组起始内存地址(即下标为 0 的地址)。
  • ElementSize\text{ElementSize}:单个元素占用的内存字节数(如 int 占用 4 字节)。
  • 下标 ii 的本质:表示该元素相对于首地址的偏移量(Offset)。如果从 0 开始,寻址公式只需一次乘法和一次加法。

操作时间复杂度机制与原因
随机访问 (Access)O(1)O(1)通过寻址公式直接计算物理内存地址,一步到位
按值查找 (Search)O(n)O(n)无序数组需要逐个遍历;若已排序,二分查找可优化至 O(logn)O(\log n)
末尾插入 / 删除O(1)O(1)直接在末尾操作,不需要移动其他元素
中间插入 / 删除O(n)O(n)为保持连续性,插入时需将后续元素向后平移;删除时需向前平移

  • 超高读取效率:支持根据下标 O(1)O(1) 随机访问。
  • CPU 缓存友好(Cache Locality):因为数据连续存放,CPU 预取机制会将其批量加载到 Cache,大幅提升访问性能。
  • 空间利用率高:不需要像链表那样额外存储指向下一个元素的指针。

  • 插入/删除成本高:平均需要平移一半的元素(O(n)O(n))。
  • 空间连续性要求高:如果内存碎片严重,即使剩余总内存足够,也可能因为找不到足够大的连续内存而分配失败。

  • 频繁查询,极少增删:如存储一周 7 天的名称、常量对照表、查找表。
  • 多维数据建模:如矩阵运算、图像像素数据(二维数组/RGB 三维数组)。
  • 作为其他数据结构的底层实现:栈(Stack)、队列(Queue)、哈希表(Hash Table)、堆(Heap)等很多复杂数据结构都是基于数组构建的。

© 2026 三七开 · 一方通行,只管向前。

旅途由 Astro 驱动 · 主题 Chirping Astro