直接选择排序

直接选择排序

  • 简述
  • 工作原理
  • 实现代码
  • 稳定性
  • 时间复杂度分析

简述

直接选择排序(Selection sort)是一种简单直观的排序算法。

工作原理

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

实现代码

//直接选择排序
    public static void selectSort(Comparable[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;
            for (int s = i; s < arr.length; s++) {
                if (arr[min].compareTo(arr[s]) > 0) {
                    min = s;
                }
            }
            swap(arr, i, min);
            for (int s= 0; s < arr.length;s++) {
                System.out.print(arr[s]+" ");
            }
            System.out.println();
        }
            
        public static void swap(Comparable[] arr, int i, int s) {
	        Comparable temp = arr[i];
	        arr[i] = arr[s];
	        arr[s] = temp;
	    }

稳定性

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

时间复杂度分析

第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。
共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2。
舍去最高项系数,其时间复杂度为 O(N^2)。

虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。
而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。
而且,交换排序比冒泡排序的思想更加直观。

你可能感兴趣的:(算法,排序)