跳转至

ch3 链表

1. 循秩访问

根据是否修改数据结构,所有操作大致分为两类

  • 静态:仅读取,数据结构的内容及组成一般不变
  • 动态:需写入,数据结构的局部或整体将改变

与操作方式相对应地,数据元素的存储与组织方式也分为两种

  • 静态:数据空间整体创建或销毁。数据元素的物理次序与其逻辑次序严格一致,可支持高效的静态操作。
  • 动态:为各数据元素动态地分配和回收地物理空间。相邻元素记录彼此的物理地址,在逻辑上形成一个整体,可支持高效的动态操作。

【链表】采用动态储存策略的典型结构。其中的元素称为节点,通过指针或引用彼此连接,在逻辑上构成一个线性序列。相邻节点彼此互称前驱或后继,没有前驱 / 后继的节点称作首 / 末节点。

  • 链表中各元素的物理地址将不再决定于逻辑次序,动态操作可以在局部完成。
  • 循秩访问:利用节点之间的相互引用,找到特定的节点。

2. 选择排序

冒泡排序扫描交换的实质效果是通过比较找到当前的最大元素 \(M\),并通过交换使之就位。事实上,经过 \(\cal{O}(n)\) 次比较确定 \(M\) 之后,仅需一次交换足矣。

【选择排序】有多个元素同时命中时,约定返回其中最靠后者,若采用平移法,可保证稳定性;若采用交换法,无法保证稳定性。

  • 时间复杂度与冒泡排序一致,均为 \(\cal O(n^2)\),但是元素的移动操作远远少于冒泡排序。

3. 插入排序

【插入排序】始终将序列视作两部分

  • 前缀 \(S[0,r)\):有序子序列
  • 后缀 \(U[r,n)\):待排子序列

初始时 \(|S| = r = 0\),反复地针对 \(e = A[r]\),在 \(S\) 中查找适当位置插入 \(e\)\(r++\)

插入排序是一个允许在线处理的排序算法。