• Java基础数组-选择排序算法


    选择排序

    • 每一次从这堆“参与比较的数据当中”找出最小值
    • 拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。

    选择排序比冒泡排序好在:每一次的交换位置都是有意义的。

    关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。
    3 2 6 1 5

    • 假设:

      • 第一个3是最小的。

      • ​ 3和2比较,发现2更小,所以此时最小的是2.

      • 继续拿着2往下比对,2和6比较,2仍然是最小的。

      • 继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1.

      • 继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的。

      • 拿着1和最左边的3交换位置。

      • 假设:

      • 第一个2是最小的。

      6 3 5

    • 假设6是最小的:

    • 6和3比对,发现3更小,所以此时最小的是3.

    • ​ …


    选择排序比冒泡排序的效率高。

    • 高在交换位置的次数上。
    • 选择排序的交换位置是有意义的。

    循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和
    最前面的数据“交换位置”。

    参与比较的数据:3 1 6 2 5 (这一堆参加比较的数据中最左边的元素下标是0)
    第1次循环之后的结果是:
    1 3 6 2 5

    参与比较的数据:3 6 2 5 (这一堆参加比较的数据中最左边的元素下标是1)
    第2次循环之后的结果是:
    2 6 3 5

    参与比较的数据:6 3 5 (这一堆参加比较的数据中最左边的元素下标是2)
    第3次循环之后的结果是:
    3 6 5

    参与比较的数据:6 5 (这一堆参加比较的数据中最左边的元素下标是3)
    第4次循环之后的结果是:
    5 6

    注意:5条数据,循环4次。

    示例代码:

    public class SelectSort {
        public static void main(String[] args) {
    
            //初始化一个一维数组
            int[] arr = {3,1,6,2,5,8,4};
    
            int count = 0;
            int count2 = 0;
            //选择排序
            //7条数据循环6次。(外层循环6次)
            for(int i = 0;i< arr.length-1;i++){
                //猜测最小值
                //i正好是“参加比较的这堆数据中“最左边那个元素的下标”
                //i是一个参与比较的这堆数据中的起点下标
                //假设起点i下标位置上的元素是最小的
                int min = i;
                for(int j = i + 1;j< arr.length;j++) {
                    //统计比较次数
                    count++;
                    if (arr[j] < arr[min]) {
                        min = j;//最小值的元素下标是j
                    }
                }
                    //当i和min相等时,表示最初猜测是对的
                    //当i和min不相等是,表示最初猜测是错的,有比这个元素更小的元素
                    //需要拿着这个更小的元素和最左边的元素交换位置
                    if (min != i) {
                        //表示存在更小的数据
                        //arr[min]最小的数据
                        //arr[i] 最前面的数据
                        int temp;
                        temp = arr[min];
                        arr[min] = arr[i];
                        arr[i] = temp;
                        //统计交换次数
                        count2++;
                }
            }
            // 冒泡排序和选择排序实际上比较的次数没变。
            // 交换位置的次数减少了。
            System.out.println("比较了多少次:" + count);
            System.out.println("交换了多少次:" + count2);
    
            //遍历排序之后的数组
            for (int i = 0;i< arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    运行结果:

    在这里插入图片描述

  • 相关阅读:
    一文带你认知定时消息发布RocketMQ
    数据结构的无头单向链表
    青龙面板安装教程
    基于python+django+mysql农业生产可视化系统
    jmeter做接口压力测试_jmeter接口性能测试
    redis 登录客户端命令
    QPS、TPS、并发用户数、吞吐量的关系
    Mybatis架构原理(二)-二级缓存源码剖析
    根据 Application ID找到 Hive 的 SQL 语句
    Postman接口自动化测试实例
  • 原文地址:https://blog.csdn.net/qq_46096136/article/details/126533356