什么是选择排序
选择排序(Selection Sort)也是一种比较简单直接的排序算法,选择排序的思想是将数组分为有序数组和无序数组两个部分,开始排序前,有序数组为空,全部为无序数组。从无序数组中选择最小的元素和无序数组的第一个元素交换,第一个元素变为有序数组的第一个,然后,继续从剩余的无序数组中选择最小的元素放在有序数组的末尾(即与无序元素的第一个交换),以此类推,遍历n-1遍,数组全部有序。
排序图示
算法特性
- 时间复杂度为:O(n2),无论什么数据输入,都需要O(n2)
- 空间复杂度为:O(1);
- 是一种稳定的排序算法(不改变排序前两个相同元素的位置)
Tips
博主日常使用的主要语言为java,生产环境中基本没有需要自己手写排序的场景,单一的排序算法在生产环境的大数据情况下都不是很实用,java保姆级别的JDK+第三方提供的工具包满足了大部分的排序需求,但是基础的排序算法是我们学习数据结构的基本功底,后续可以结合java内部提供的sort方法的实现来一起探讨下排序算法在生产环境中的使用。
代码实现
public class SelectionSort implements SortTest {
@Override
public int[] sort(int[] sortArray) {
// 代码健壮性
if (sortArray == null) {
return null;
}
// 边界case
if (sortArray.length <= 1) {
return sortArray;
}
// 不改变输入值,也可以直接在原数组上操作,根据需要自己选择
int[] copyArr = Arrays.copyOf(sortArray, sortArray.length);
for (int i = 0; i < copyArr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < copyArr.length; j++) {
// 查找最小元素
if (copyArr[j] < copyArr[minIndex]) {
minIndex = j;
}
}
// 最小元素和无序数组第一个交换
int temp = copyArr[i];
copyArr[i] = copyArr[minIndex];
copyArr[minIndex] = temp;
}
return copyArr;
}
}