Java算法:选择排序

一、选择排序

选择排序(Selection sort)是一种简单直观的 排序算法

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

二、选择排序步骤

1、首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

2、再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置。

3、重复第二步,直到所有元素均排序完毕。

三、java实现选择排序

java 复制代码
   public static void main(String[] args) {

        //数组数据
        Integer[] arr = getData();
        System.out.println(Arrays.toString(arr));

        //选择排序
        selectSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 数组进行排序
     *
     * @param arr
     * @return
     */
    private static Integer[] selectSort(Integer[] arr) {
        //循环
        for (int i = 0; i < arr.length; i++) {
            //默认第一个最小值
            int min = arr[i];
            //默认第一个最小值索引
            int min_index = i;
            //循环比较
            for (int j = i + 1; j < arr.length; j++) {
                //比较找出最小值
                if (arr[j] < min) {
                    min = arr[j]; //最小值
                    min_index = j; //对应索引
                }
            }
 
            //判断最小索引不等于i索引,就交换值;
            if (min_index != i) {
                arr[min_index] = arr[i]; //将查找到最小值与第i个值交换位置
                arr[i] = min; //将最小值赋给对应的位置
            }

        }
        return arr;

    }

    /**
     * (1) 生成1-100范围的随机数20个
     */
    private static Integer[] getData() {
        Set<Integer> sets = new HashSet<>();
        Random random = new Random();
        while (true) {
            //生成1-100的随机数
            int ran = random.nextInt(100) + 1;
            //添加
            sets.add(ran);
            //判断生成20个数据
            if (sets.size() >= 20) {
                break;
            }
        }
        // 将Set转换成数组
        Integer[] arr = sets.toArray(new Integer[sets.size()]);
        return arr;
    }

效果:

四、性能分析

时间复杂度 :
最好最差情况,选择排序的数据之间的比较次数都是固定的,
而最好情况:数组有序时,需要交换0次,最坏情况:数组无序时,交换n-1次
总体的排序时间是比较+交换的总和,所以时间复杂度为O(N^2)

选择排序理解和实现起来都比较简单,但效率比较低,一般很少使用选择排序

👉空间复杂度 :
没有额外空间的开销,只有常数个记录的辅助空间,空间复杂度为O(1)

相关推荐
地平线开发者9 分钟前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者22 分钟前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
没有bug.的程序员42 分钟前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋1 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
星星火柴9361 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~1 小时前
《设计模式》装饰模式
java·设计模式
A尘埃2 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
艾莉丝努力练剑2 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法