简介
选择排序也属于基本的教学式排序,真正的开发基本不会独立使用。同样属于蛮力法。
- 选择排序的思想也非常简单
- 首先假设
元素0
是最小值,用index
保存。 - 遍历所有元素,如果碰到比元素0**更小**的。
index
记录这个更小的元素的下标。 - 遍历比较完后,发现
index
改变。说明有最小值,则将这个最小值和元素0进行交换。 - 这样,第一次遍历完。找到最小值。
- 接下来,同样的方式从
元素1
开始假设、比较、交换元素。
- 首先假设
核心代码
/**
* 选择排序
*
* @param arr
*/
public static void selectSort(int[] array) {
for (int i = 0;i < array.length - 1; i++) {
// 1.假设元素i为最小值
int index = i;
// 2.遍历并比较,是否有比元素i更小的
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[index]) {
// index始终保留值最小的元素下标
index = j;
}
}
if (index != i) { // 3.说明找到最小值
int temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
- 和冒泡排序一样的难度,简单!
- 可能和其它地方的选择排序略有不同,但我觉得这种方式更加层次清晰。每一步该干什么就干什么,目的明确。不会在遍历的同时做其它事,虽然这个算法很简单。
优缺点
优点
- 简单!
- 是快速排序的基础
- 循环几次知道几个最小值
缺点
- 效率不高,毕竟是蛮力法。
复杂度
时间复杂度
O(n^2)
空间复杂度
O(1)
稳定度
- 不稳定。很多博客写的稳定不知道依据是什么。
- 假设:有数组
5 8 5 2 9
,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。 - 不信可以参考选择算法百度百科
应用场景
- 同冒泡排序一样,适用于数据量较少的场景中。