JAVA十大排序算法之选择排序详解

 更新时间:2021年08月23日 09:40:35   投稿:BJT  
这篇文章主要介绍了java中的选择排序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

选择排序

1.找到数组中最大(或最小)的元素

2.将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换)

3.在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

image-20210728144443166

代码实现

对下面数组实现排序:{87, 23, 7, 43, 78, 62, 98, 81, 18, 53, 73, 9}

动图演示

选择排序

代码实现

public class SelectionSort {
    public static final int[] ARRAY = {87, 23, 7, 43, 78, 62, 98, 81, 18, 53, 73, 9};
    public static int[] sort(int[] array) {
        if (array.length == 0) {
            return array;
        }
        for (int i = 0; i < array.length; i++) {
            //最小数的下标,每个循环开始总是假设第一个数最小
            int minIndex = i;
            for (int j = i; j < array.length; j++) {
                //找到最小索引
                if (array[j] < array[minIndex]) {
                    //保存最小索引
                    minIndex = j;
                }
            }
            //最小索引的值
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }
    public static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + "  ");
        }
        System.out.println("");
    }
    public static void main(String[] args) {
        print(ARRAY);
        System.out.println("============================================");
        print(sort(ARRAY));
    }
}

时间复杂度

很明显,和冒泡排序相比,在查找最小(或最大)元素的索引,比较次数仍然保持为O(n2)

,但元素交换次数为O(n)。

算法稳定性

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,数组5,8,5,2,9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

image-20210728144637093

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Mybatis 动态sql的编写与开启二级缓存

    Mybatis 动态sql的编写与开启二级缓存

    二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的SQL语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的,这篇文章主要介绍了Mybatis 动态sql的编写|开启二级缓存,需要的朋友可以参考下
    2023-02-02
  • 详细学习Java Cookie技术(用户登录、浏览、访问权限)

    详细学习Java Cookie技术(用户登录、浏览、访问权限)

    这篇文章主要为大家详细介绍了Java Cookie技术,显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放)等,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • MyBatis的CRUD中的不同参数绑定查询实现

    MyBatis的CRUD中的不同参数绑定查询实现

    本文主要介绍了MyBatis的CRUD中的不同参数绑定查询实现,主要包括单个参数传递绑定,序号参数传递绑定,注解参数传递绑定,pojo(对象)参数传递绑定,map参数传递绑定这几种类型,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Java+mysql用户注册登录功能

    Java+mysql用户注册登录功能

    这篇文章主要为大家详细介绍了Java结合mysql实现用户注册登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • idea中创建jsp项目的详细实战步骤

    idea中创建jsp项目的详细实战步骤

    才学javaWeb,以防自己忘记创建项目的过程,所以浅浅的记录一下吧,下面这篇文章主要给大家介绍了关于idea中创建jsp项目的详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Spring Boot+Drools规则引擎整合详解

    Spring Boot+Drools规则引擎整合详解

    本篇文章主要介绍了Spring Boot+Drools规则引擎整合,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java中的StringBuilder()常见方法详解

    Java中的StringBuilder()常见方法详解

    StringBuilder是一个可变的字符序列,此类提供一个与 StringBuffer 兼容的 API,但不保证同步,这篇文章主要介绍了StringBuilder()常见方法,需要的朋友可以参考下
    2023-09-09
  • Spring Cloud Eureka高可用配置(踩坑记录)

    Spring Cloud Eureka高可用配置(踩坑记录)

    在进行Eureka高可用配置时,控制台一直出现“......”的错误,但是在浏览器中输入地址:peer1:8761 却是可正常运行,这篇文章主要介绍了Spring Cloud踩坑之Eureka高可用配置,需要的朋友可以参考下
    2023-08-08
  • java8中新的Date和Time详解

    java8中新的Date和Time详解

    这篇文章主要是java8中新的Date和Time,探讨新Date类和Time类背后的设计原则,有所需要的小伙伴希望能帮助到你
    2016-07-07
  • Java 线程池详解及创建简单实例

    Java 线程池详解及创建简单实例

    这篇文章主要介绍了Java 线程池详解及创建简单实例的相关资料,需要的朋友可以参考下
    2017-02-02

最新评论