选择排序
核心思路
统一视角:分治策略
- 分:将数组划分为已排序部分和未排序部分;
- 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;
或者,更具体点:
- 分:划分固定比例 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,空集
实现
性质
- 稳定性?
- 原地性?
- 自适应性?
- 在线性?