(纯白话算法系列)选择排序、时间复杂度分析、代码演示

定义:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

纯白话说:所谓选择排序,即每次循环挑出最小的数,将其与本次循环的起点位置元素进行交换,如果有N个元素,则对比N-2次,因为前面N-1个元素都排好了位置,最后一位肯定是最大的,又因为是对比,所以自然会比元素个数少一。

来看一个动态图:

图片摘自--https://www.cnblogs.com/ylsm-kb/p/9505270.html

从图上可以看出,每次循环都找出了最小值,然后跟起点位置元素进行交换。

直接看代码:

package com.bean.select_sort;

import java.util.Arrays;

public class SelectSort {

    public static void SelectSorted(int[] arr) {
        if (arr == null || arr.length < 2) {//数组为空或元素小于2没比较意义
            return;
        }
        for (int i = 0; i < arr.length-1; i++) {
            int minIndex = i;
            for (int j = i+1; j<arr.length-1; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            swap(arr,i,minIndex);
        }
    }
    private static void swap(int[] arr,int left, int right) {
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }

    public static void main(String[] args) {
        int arr[] = {5,1,5,4,11,21,30};
        SelectSorted(arr);
        System.out.println(Arrays.toString(arr));
    }
}


代码也比较简单,我用一个示意图来描述代码:

每次都会把排序最小的元素放在循环的第一个位置,循环的重点位置都是N-1,为什么不是N前面已经说过了,因为N之前的位置都排序完了,最后一位肯定是最大的元素。

所以第一层for循环是为了限定起始位置和终点位置,第二层循环是在限定范围内进行查找,找到最小元素的索引minIndex,找到之后,将其位置记录下来,并将数组中的起始位置元素和minIndex数组的元素进行交换。

时间复杂度:

很明显这又是一个等差数列,所以时间复杂度是O(n²)。

posted @ 2019-07-23 22:06  Bean冷的心  阅读(124)  评论(0编辑  收藏  举报