目录
选择排序
简单选择排序
算法原理
- 每一趟在待排序元素中选取关键字最小的元素加入有序子序列
- 必须进行总共n-1趟处理
性能
- 👩💻 时间复杂度:O(n^2)(始终是)
- 空间复杂度:O(1)
- 稳定性:不稳定
- 适用性:顺序表、链表都可以
👩💻 堆排序
堆
顺序存储的“完全二叉树”
- 结点i的左孩子是2i;右孩子是2i+1;父节点是i/2
- 编号≤n/2的结点都是分支节点
大根堆(根 ≥ 左、右);小根堆(根 ≤ 左、右)
算法思想(以大根堆为例)
建堆
- 编号≤n/2的所有结点依次“下坠”调整(自底向上处理各分支节点)
- 👩💻 调整规则:小元素逐层“下坠”(与关键字更大的孩子交换)
排序
- 将堆顶元素加入有序子序列(堆顶元素与堆底元素交换)
- 堆底元素换到堆顶后,需要进行“下坠”调整,恢复“大顶堆”的特性
- 上述过程重复n-1趟
特性
- 空间复杂度:O(1)
- 时间复杂度:建堆O(n)、排序O(nlogn);总的时间复杂度O(nlog2n)
- 稳定性:不稳定
- 基于大根堆的堆排序得到“递增序列”,基于小根堆的堆排序得到“递减序列”
插入
- 新元素放到表尾(堆底)
- 根据大/小根堆的要求,新元素不断“上升”,直到无法继续上升为止
删除
- 被删除元素用表尾(堆底)元素替代
- 根据大/小根堆的要求,替代元素不断“下坠”,直到无法继续下坠为止
关键字对比次数
- 每次“上升”调整只需对比关键字1次
- 每次“下坠”调整可能需要对比关键字2次,也可能只需对比1次
</