zoukankan      html  css  js  c++  java
  • 14-选择排序

    1. 举例说明

    n 个数据,总共进行 n-1 次大的循环,得到一个按从小到大排列的有序序列:

    1. 第 1 次从 arr[0]~arr[n-1] 中选取最小值,与 arr[0] 交换
    2. 第 2 次从 arr[1]~arr[n-1] 中选取最小值,与 arr[1] 交换
    3. 第 3 次从 arr[2]~arr[n-1] 中选取最小值,与 arr[2] 交换
    4. 第 i 次从 arr[i-1]~arr[n-1] 中选取最小值,与 arr[i-1] 交换
    5. 第 n-1 次从 arr[n-2]~arr[n-1] 中选取最小值,与 arr[n-2] 交换

    待排序元素范围从头开始缩减:每遍历一轮,确定一个 minValue,就使得下一次遍历的范围 - 1 (与 bubble 正好相反,它是从末尾缩减)。

    2. 标配

    • 平均时间复杂度:n^2
    • 最坏时间复杂度:n^2
    • 最好时间复杂度:n^2
    • 空间复杂度:O(1)
    • 不稳定

    3. 代码实现

    public class SelectSortDemo {
        public static void main(String[] args) {
            // int[] arr = {18, 3, 22, 1, 17, 24, 6, 15};
            // selectSort(arr);
            int arr2[] = new int[80000];
            for (int i = 0; i < 80000; i++) arr2[i] = (int) (Math.random() * 800000);
    
            Date date1 = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String str1 = sdf.format(date1);
            System.out.println(str1);
            selectSort(arr2); // 测试:8w个数据
            Date date2 = new Date();
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String str2 = sdf2.format(date2);
            System.out.println(str2);
        }
    
        public static void selectSort(int[] arr) {
            int minValIndex, temp;
            for (int i = 0; i < arr.length - 1; i++) {
                // 假设 [i, arr.length) 区间内数组最小值是 arr[i]
                minValIndex = i;
                // 找到从 i 之后的数组中的最小的元素
                for (int j = i+1; j < arr.length; j++) {
                    if (arr[minValIndex] > arr[j]) {
                        minValIndex = j;
                    }
                }
                // 如果这个最小值的索引不是 i,就交换把最小值赋值给索引为 i 的元素
                // 否则,就像假设的那样,arr[i] 就是 [i, arr.length) 区间内数组最小值
                if (minValIndex != i) {
                    temp = arr[minValIndex];
                    arr[minValIndex] = arr[i];
                    arr[i] = temp;
                }
                // System.out.printf("第%d趟:%s
    ", i+1, Arrays.toString(arr));
            }
        }
    }
    
  • 相关阅读:
    js的同步与异步
    单体应用SSM
    Spring 事务管理简介
    Linux
    Docker
    spring Cloud Netflix
    平台即服务
    MySQL InnoDB 索引组织表 & 主键作用
    Innodb Double Write
    Laravel 5.6: Specified key was too long error
  • 原文地址:https://www.cnblogs.com/liujiaqi1101/p/12327597.html
Copyright © 2011-2022 走看看