选择排序 (Select Sorting)

104 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情

二、选择排序 (Select Sorting)

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

思路

第 一次从arr[0] ~ arr[n-1]中选取最小值,与arr[0]交换,第二次从 arr[1] ~ arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~ arr[n-1]中 选取最小值,与arr[2]交换,…,第i次从arr[i-1] ~ arr[n-1]中选取最小值, 与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2] 交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

image-20220902220027274

分析

原始数组 : 101,34,119,1,要求:由小到大

每次执行的得到的结果:

  1. 1,34,119,101
  2. 1,34,119,101
  3. 1,34,101,119

结论

  1. 需要执行数组大小 -1轮排序

  2. 每一轮都是一个循环,循环的规则(代码)

    1. 先假定当前数为最小数,
    2. 然后和后面的数进行比较,若当前数更小,重新得到最小数,并得到下标
    3. 遍历到数组的最后时,就得到本轮的最小数和下标
    4. 交换
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
​
/**
 * @author Kcs 2022/9/2
 */
public class SelectSorting {
    public static void main(String[] args) {
        int[] arr = {101, 34, 119, 1};
        System.out.println("排序前:" + Arrays.toString(arr));
        selectSort(arr);
        System.out.println("排序后:" + Arrays.toString(arr));
​
        //测试时间
        int[] test = new int[8000];
        for (int i = 0; i < 8000; i++) {
            test[i] = (int) (Math.random() * 80000);
​
        }
        Date beforeDate = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formatBefore = simpleDateFormat.format(beforeDate);
        System.out.println("排序前时间" + formatBefore);
​
        selectSort(test);
​
        Date afterDate = new Date();
        String afterDateformat = simpleDateFormat.format(afterDate);
        System.out.println("排序前时间" + afterDateformat);
​
    }
​
    /**
     * 选择排序
     * 时间复杂度 O(n^2)
     * @param arr
     */
    public static void selectSort(int[] arr) {
​
        //原始数组 : 101,34,119,1,要求:由小到大
​
        for (int i = 0; i < arr.length - 1; i++) {
            //起始索引
            int minIndex = i;
            int min = arr[i];
            for (int j = i + 1; j < arr.length; j++) {
                //由大到小:>  由小到大:< ;当前值进行比较,找出索引
                if (min > arr[j]) {
                    min = arr[j];
                    // 得到最小值索引
                    minIndex = j;
                }
            }
​
            //最小值放在arr[0]
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
            // System.out.println("第" + (i + 1) + "轮排序结果:" + Arrays.toString(arr));
​
        }
    }
}