Java 简单选择排序算法,java基础算法系列(三)(选择排序的简单优化讲解)

8febc80c39c3cb66f830e26df6b344c8.png

本文为原创资源,欢迎分享,转载。

选择排序也是十大排序算法中的一种,他是将整个数组从头到尾全部扫描一遍,然后选择最小的与第一位进行交换,接着再在剩下的元素中进行扫描,直到扫描完毕,最终,得到一个有序数列。这是一种思路非常简单的排序算法。我们先简单的实现一下,代码如下:public static void main(String[] args) {        int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 };        int n = arr.length - 1;// 经过n-1次提取最小最大值        long startTime = System.nanoTime(); // 获取开始时间        for (int i = 0; i  arr[j]) {                    min = j;                }            }            if (min != i) {                int tmp = arr[min];                arr[min] = arr[i];                arr[i] = tmp;            }        }        long endTime = System.nanoTime(); // 获取结束时间        System.out.println("排序结果:" + Arrays.toString(arr));        System.out.println("程序运行时间: " + (endTime - startTime) + "ns");    }

打印结果如下:排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]程序运行时间:3100ns

最基本的选择排序是一次将一个元素进行位置的确定,那么我们可不可以一次确定两个元素的位置呢?优化代码如下:public static void main(String[] args) {        int[] arr = { 1, 3, 4, 2, 6, 7, 8, 0, 5 };        long startTime = System.nanoTime(); // 获取开始时间        // 最小值下标        int min = 0;        // 最大值下标        int max = 0;        int left = 0;        int right = arr.length - 1;        int j = 0;        // 循环size-1次        while (left  arr[max]) {                    max = j;                }                if (arr[j] 

打印结果如下:排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8]程序运行时间:2600ns

有朋友要问了,为什么要加上这段代码呢:if (min == right) {            min = max;        }

比如数组{ 1, 3, 4, 2, 6, 7, 8, 0, 5 };max=0,min=8;max!=8,交换0和8,[0, 1, 2, 3, 4, 5, 6, 7, 8]但是max依旧是0,minpos依旧是8,min!=0,又再次交换0和8.  所以为防止min在最大值要插入的位置,要加上上面这块代码。

a438a50f302ae77667b69b1113550330.png

6b9eec88b37b1aaeeac6be77fdca0ba8.png

本篇会收录在满满干货-软文分类中,欢迎转载,分享!!!!

往期好文:

java基础算法系列(冒泡排序的简单优化讲解一)

java基础算法系列(二)冒泡排序的优化讲解(鸡尾酒算法)

java学会这些,我就入门啦!(基础篇一)栈与堆

java学会这些,我就入门啦!(基础篇二)重载与重写

java学会这些,我就入门啦!(基础篇三)异常讲解与常见的异常

java学会这些,我就入门啦!(基础篇四)String、StringBuffer、StringBuilder的区别?

java学会这些,我就入门啦!(基础篇五)流与IO流

java学会这些,我就入门啦!(基础篇六)HashMap、Hashtable、ConcurrentHashMap的原理与区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值