选择排序
选择排序
一、算法描述
1.1 核心思想
- 数据分为已排序区间和未排序区间
- 从未排序区间中找到最小/最大的元素,放到到已排序区间的尾部
- 执行 n 轮后,所有未排序元素都会迁移到已排序区间中
1.2 细节解释
比如说,数组 [2, 7, 1, 4, 3, 6, 5]
。
首先分成未排序和已排序区间,已排序区间一开始是空的:
1 | 已排序 未排序 |
首先找到未排序区间的最小值,也就是 1,将 1 迁移到已排序区间中:
1 | 已排序 未排序 |
继续从未排序区间找最小值,得到 2,然后将 2 移动到已排序区间:
1 | 已排序 未排序 |
以此类推,分别交换得到 3、4、5、6、7 的最终位置:
1 | 已排序 未排序 |
1 | 已排序 未排序 |
1 | 已排序 未排序 |
1 | 已排序 未排序 |
1 | 已排序 未排序 |
经过 n 轮交换,数组就排好序了。
二、算法实现
1 | public void selectSort(int[] arr) { |
执行过程如下:
1 | ===== 初始数组 ===== |
三、算法分析
3.1 时间复杂度
- 最好时间复杂度:O(n^2)
- 最坏时间复杂度:O(n^2)
- 平均时间复杂度:O(n^2)
3.2 空间复杂度
- 空间复杂度:O(1)
- 原地算法
3.3 稳定性
- 不稳定排序算法
附录
1 | /** |