排序算法 — 选择排序(Selection Sort)

209 阅读2分钟

什么是选择排序

选择排序(Selection Sort)也是一种比较简单直接的排序算法,选择排序的思想是将数组分为有序数组和无序数组两个部分,开始排序前,有序数组为空,全部为无序数组。从无序数组中选择最小的元素和无序数组的第一个元素交换,第一个元素变为有序数组的第一个,然后,继续从剩余的无序数组中选择最小的元素放在有序数组的末尾(即与无序元素的第一个交换),以此类推,遍历n-1遍,数组全部有序。

排序图示

image.png

算法特性

  • 时间复杂度为: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;
    }
}