原理
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最大(或最小)的一个元素,存放在无序区间序列的最后(起始)位置,每放一次,无序区间长度减1,直至无序区间长度变为0,此时全部待排序的数据元素排完。选择排序是不稳定的排序方法。
一趟选择排序结束后,最大的数在最后面,再遍历未排序区间,第n趟结束后,前n大的n个数在集合的最后面,循环这个步骤,全部排序完成数组有序。
代码实现
public static void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int max = 0;
for (int j = 1; j < array.length - i; j++) {
if (array[j] > array[max]) {
max = j;
}
}
int tmp = array[max];
array[max] = array[array.length - i - 1];
array[array.length - i - 1] = tmp;
}
}
代码分析
性能分析
时间复杂度:
选择排序对数据不敏感,无论数组有序,还是逆序,都要遍历选择无序区间中最大的元素,所以时间复杂度恒为:O(n2)。
空间复杂度:
空间复杂度为O(1),是因为选择排序花费了常数个额外空间。
稳定性
选择排序是不稳定的排序方法。
例如:int[] array = {1,2,4,3,9a,7,6,9b};
选择排序交换该情况时,第一次选择出的最大数为9a,将9a放在已经排好序的数组最后,第二次选择出的最大数为9b,放在排好序的数组的倒数第二个。结果,9b跑到9a前面。说明选择排序无法保证算法的稳定性。