十大排序算法(五), 选择排序

168 阅读1分钟

个人博客传送门

算法图解

选择 一个最大/小的数, 排到最前面

17400545-e3a784e614fca758.gif

假设数组长度为 n

  1. i = 0 , 遍历 [i,n] 个数字, 选择 一个最小的, 和 i 交换
  2. i + 1
  3. 重复 1 2 步骤, 直到 i == n

实现

        int n = array.length;
        int curMin;

        for (int i = 0; i < n - 1; i++) {
            curMin = i;
            for (int j = i + 1; j < n; j++) {
                curMin = array[curMin] > array[j] ? j : curMin;
            }
            doSwap(array, i, curMin);
        }

时间复杂度

f(n) = n(n-1)/2 = O(n^2)

空间复杂度

O(1), 没有使用多余的空间

完整代码

class SelectionSort {

    private static void sort(int[] array) {
        if (array == null || array.length == 1) {
            return;
        }

        int n = array.length;
        int curMin;

        for (int i = 0; i < n - 1; i++) {
            curMin = i;
            for (int j = i + 1; j < n; j++) {
                curMin = array[curMin] > array[j] ? j : curMin;
            }
            doSwap(array, i, curMin);
        }
    }

    private static void doSwap(int[] array, int x, int y) {
        int t = array[x];
        array[x] = array[y];
        array[y] = t;
    }

    public static void main(String[] args) {
        int[] array = {111, 522, 77, 98, 36, 12, 13, 48};
        sort(array);
        System.out.println(arrayToString(array));
    }

    private static String arrayToString(int[] array) {
        StringBuilder builder = new StringBuilder();
        for (int t : array) {
            builder.append(t + " ");
        }
        return builder.toString();
    }
}