排序算法——选择排序

目录

基本介绍

算法思想:

实例:

⛅思路分析:

总结:

代码实现:

算法性能分析

时间复杂度

空间复杂度

稳定性


基本介绍

选择排序(select sorting)也属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再按照规定交换位置后达到排序的目的。

算法思想:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,将元素存放在序列的起始位置(即与待排序列的第一个元素的位置进行交换)。然后再从剩余的未排序元素中寻找最小(或最大)的元素,然后存放在已排序序列的末尾。以此类推,直到将待排序的元素全部排完。

实例:

原始数组:[101 , 34 , 119 , 1]

⛅思路分析:

第一趟排序:从4个元素里面找到最小的,与第1个元素进行交换,将最小元素存放在起始位置

排序后为:1,34 , 119 , 101

第二趟排序:从剩下的3个元素里面找到最小的,与待排序列的第1个元素进行交换,将最小元素存放在已经排好序的序列尾部。

排序后为: 1, 34 , 119 , 101

第三趟排序:从剩下的2个元素里面找最小的,与待排序列的第1个元素进行交换

排序后为:1,34 , 101 , 139

 

总结:

  1. 选择排序一共有数组大小-1轮排序
  2. 每一轮排序,又是一个循环,循环的规则如下(在代码中实现):
  • 先假定当前这个数是最小数
  • 和后面的每个数进行比较,如果发现有比它更小的数,就重新确定最小数,并得到下标
  • 当遍历完数组之后,就会得到本轮最小数及其下标
  • 进行交换

代码实现:


public class SelectSort {
    public static void main(String[] args) {
        int[]arr={101,34,119,1};
        selectSort(arr);
    }
    public  static  void selectSort(int[]arr) {
        //安全监测
        if (arr == null || arr.length == 1) {
            return;
        }
        for (int count = 0; count < arr.length - 1; count++) {
            int minIndex = count;
            int min = arr[count];
            for (int i = minIndex + 1; i < arr.length; i++) {
                if (min > arr[i]) {//说明假定的最小值并不是最小
                    min = arr[i];//重置min
                    minIndex = i;//重置minIndex
                }
            }
            //进行交换,将最小值放在序列前
            if (minIndex!=count) {
                arr[minIndex] = arr[count];
                arr[count] = min;
            }
            System.out.println("第"+(count+1)+"轮后:" + Arrays.toString(arr));
        }
    }

运行结果:

排序算法——选择排序_第1张图片

算法性能分析

时间复杂度

最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2),因为无论你是否完全有序,还是完全逆序,都需要找出后边的最小值进行替换。

相比较冒泡排序,每次比较后,只更新最小值的下标,每轮循环值最多只做一次值交换。时间上得到了很大的提升。但是也是使用了双层循环,时间复杂度和冒泡排序的一样。

空间复杂度

空间复杂度为O(1)

稳定性

选择排序是不稳定的排序算法。

举个例子:

例如数组:[ 5 , 8 , 5 , 2 ,]

使用选择排序算法第一次找到的最小元素是2,与第一个位置的元素5进行交换,那此时第一个5和中间的5顺序就发生了变化,因此不稳定。

你可能感兴趣的:(Java,数据结构与算法,排序算法,算法,java)