欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

选择排序

程序员文章站 2022-03-01 15:12:02
...

算法思想

找到数组中第i小的元素并将该元素与当前i位置上的元素进行交换

Java实现

import java.util.Arrays;

public class Selection {
    /* 选择排序,升序 */
    public static void sort(Comparable[] a) {
        for (int i = 0, len = a.length; i < len; i++) {
            // 寻找第i小元素的下标
            int min = i;
            for (int j = i + 1; j < len; j++) {
                if (a[j].compareTo(a[min]) < 0) {
                    min = j;
                }
            }
            // 把第i小的元素放在数组下标为i的位置
            // 交换元素的代码写在内层循环之外
            exchange(a, i, min);
        }
    }

    /* 交换指定下标元素的位置 */
    private static void exchange(Comparable[] a, int i, int j) {
        Comparable tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }

    /* 测试 */
    public static void main(String[] args) {
        Integer[] a = new Integer[] { 9, 2, 3, 4, 1, 1, 7, 3, 4, 16, 22, 10 };
        System.out.println(Arrays.toString(a));
        Selection.sort(a);
        System.out.println(Arrays.toString(a));
        System.out.println("end");
    }
}

算法分析

时间复杂度: O(n^2)

稳定性: 不稳定, 交换操作会破坏相对顺序

交换次数: N 每次找到第i小的元素就要进行一次交换

比较次数: (N-1)+(N-2)+…+2+1~N^2/2

特点

  • 运行时间与输入无关: 扫描一遍数组不能为下次扫描提供信息, 不善于利用输入的相对有序性

  • 数据的移动次数是最少的: 交换次数与数组的大小是线性关系

原地操作几乎是选择排序的唯一优点,当空间复杂度要求较高时,可以考虑选择排序;实际适用的场合非常罕见。

参考资料

算法第4版

https://zh.wikipedia.org/wiki/选择排序

https://baike.baidu.com/item/选择排序#2