选择排序
核心思路
统一视角:分治策略
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;
或者,更具体点:
- 分:划分固定比例 1 : (n-1),即 [已排序 | 未排序];
- 治:先解决单元素归位问题,再扩大已排序区间;
- 性能:由于划分始终是线性 1 : n-1,路径深度为 n,故复杂度为 O(n^2);
核心逻辑:
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,找到未排序部分的最小值,将它与未排序部分的首元素交换
状态变化追踪
初始
- 已排序部分:[0, -1]
- 未排序部分:[0, n-1]
第1轮(i=0)
操作:从左向右遍历未排序部分[0, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。
结果
- 已排序部分:[0, 0]
- 未排序部分:[1, n-1]
第2轮(i=1)
操作:从左向右遍历未排序部分[1, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。
结果
- 已排序部分:[0, 1]
- 未排序部分:[2, n-1]
第k轮(i=k-1)
操作:从左向右遍历未排序部分[k-1, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。
结果
- 已排序部分:[0, k-1]
- 未排序部分:[k, n-1]
第n-1轮(i=n-2)
操作:从左向右遍历未排序部分[n-2, n-1],找到未排序部分的最小值,将它与未排序部分的首元素交换。
结果
- 已排序部分:[0, n-2]
- 未排序部分:[n-1, n-1]
算法结束后
结果
- 已排序区间:[0, n-1]
- 未排序区间:[n, n-1],空集
实现
性质
- 稳定性?
- 原地性?
- 自适应性?
- 在线性?