目录
1. 选择排序动画
2. 选择排序 Java 实现
public void selectionSort(int[] numbers) {
int length = numbers.length;
if (length <= 1) {
return;
}
for (int i = 0; i < length - 1; ++i) {
// 设置最小值的索引为当前索引
int minIndex = i;
for (int j = i + 1; j < length; ++j) {
// 循环查找未排序的最小值
if (numbers[j] < numbers[minIndex]) {
// 设置最小值的索引值
minIndex = j;
}
}
// 当前位置就是最小位置,不做交换
if (minIndex == i) {
continue;
}
// 未排序的最小值与当前值交换
numbers[i] ^= numbers[minIndex];
numbers[minIndex] ^= numbers[i];
numbers[i] ^= numbers[minIndex];
}
}
- 1. 重复(元素个数-1)次
- 1.1 把第一个没有排序过的元素的索引设置为最小值索引
- 1.2 遍历每个没有排序过的元素
- 1.2.1 如果元素 < 现在的最小值索引处的值
- 1.2.2 将此元素的索引设置为新的最小值索引
- 1.2.3 将最小值索引处的值与第一个没有排序过的索引位置交换
3. 总结
时间复杂度
选择排序无论数组是否有序时间复杂度均为 O(n^2)
空间复杂度
数据交换在原数组中进行,标记位使用常数级的空间,所以空间复杂度 O(1)
排序稳定性
以数组 {2,5,3,5,1} 举例
第一次循环完成后:{1,5,3,5,2}
第二次循环完成后:{1,2,3,5,5}
最终数据排序完成后: {1,2,3,5,5}
对比排序后的数组和原数组,可以发现数组中两个 5 的先后顺序已经发生改变
所以选择排序是不稳定的排序