选择排序
选择排序是一种很容易理解和实现得简单排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
特点
运行时间和输入无关
为了找出最小的元素而扫描一遍数组并不能为下一便扫描提供什么信息,这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶的发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长。而其他算法会更善于理应输入的初始状态。
数据移动是最少的
每次交换都会改变两个数组元素的值,因此选择排序用了N次交换——交换次数和数组大小是线性关系。
动图演示
Java代码实现
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 总共要经过 N-1 轮比较
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每轮需要比较的次数 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 记录目前能找到的最小值元素的下标 min = j;
}
}
// 将找到的最小值和i位置所在的值进行交换
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}
参考:https://www.runoob.com/w3cnote/selection-sort.html