美文网首页
经典排序算法系列3-选择排序

经典排序算法系列3-选择排序

作者: xgangzai | 来源:发表于2019-11-22 10:29 被阅读0次

Selection Sort 选择排序

需求

对N个整数升序排序

思路

类似插入排序,分有序和无序两部分,每次从无序部分中找出最小的一个元素放到有序部分的末尾。

算法评判

  • 时间复杂度

    O(N^2)

  • 空间复杂度

    O(1)

    只需要常量级的辅助空间,所以也叫原地排序

  • 稳定性

    结论:不稳定

实现代码如下

public void sort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int min = i;
        for (int j = i; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        swap(arr, min, i);
    }
}

为什么选择排序是不稳定的,看下面的示例代码

public void sort(Item[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int min = i;
        for (int j = i; j < arr.length; j++) {
            if (arr[j].compareTo(arr[min]) < 0) {
                min = j;
            }
        }
        swap(arr, min, i);
    }
}

 void swap(Item[] arr, int i, int j) {
    Item t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
}

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    private static class Item implements Comparable<Item> {
        private int key;

        private String value;

        @Override
        public int compareTo(Item o) {
            return this.key - o.key;
        }

        @Override
        public String toString() {
            return key + ":" + value;
        }
    }

public static void main(String[] args) {
        SelectionSort sort = new SelectionSort();
        Item[] arr=new Item[5];
        arr[0]=new Item(5,"51");
        arr[1]=new Item(4,"41");
        arr[2]=new Item(5,"52");
        arr[3]=new Item(6,"61");
        arr[4]=new Item(4,"42");
  //[5:51, 4:41, 5:52, 6:61, 4:42]
        System.err.println(Arrays.toString(arr));

        sort.sort(arr);
  //[4:41, 4:42, 5:52, 5:51, 6:61]
        System.err.println(Arrays.toString(arr));
  //"52"和"51"两个元素的相对次序被改变了
    }

第一次选出的最小元素是41,与51交换,[ 4:41,5:51, 5:52, 6:61, 4:42]

第二次宣促的最小元素是42,与51交换,[ 4:41,4:42, 5:52, 6:61, 5:51]

只要有相同的元素,并且不在最后,则前面的元素一定会被交换到后面去。所以选择排序是不稳定的排序算法。

冒泡排序、插入排序和选择排序三者对比

三者的时间复杂度和空间复杂度相同,冒泡排序和插入排序是稳定的排序算法,选择排序不是,所以在这三者中,优先选择冒泡排序和插入排序。

那冒泡排序和插入排序各种维度的比较都一致,所以两种排序算法完全等效吗?

非也,虽然两者的时间复杂度一样,但深入观察,插入排序中每次移动元素只需要一次赋值操作,冒泡排序相邻元素交换时需要三次赋值操作,所以这两者比起来,插入顺序更胜一筹。

插入排序 > 冒泡排序 > 选择排序

相关文章

网友评论

      本文标题:经典排序算法系列3-选择排序

      本文链接:https://www.haomeiwen.com/subject/fdyfwctx.html