算法大神之路----排序(选择排序法)-程序员宅基地

技术标签: ViewUI  java  前端  

选择排序法,顾名思义,就是把特定的数据选择出来进行排序.

选择排序法有两种方式

  • 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置
  • 如果由小到大排序,那么就将最小值放到第一个位置

以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描.

方法分析

  • 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此,次数为n(n-1)/2次,时间复杂度为O(n2).
  • 由于选择排序是以最大或者最小值直接与未排序的数据进行比较以及交换,数据排列很有可能被改变,故选择排序法不是一个稳定的排序法
  • 空间复杂度最佳,只需要一个额外的空间

综合以上的情况,选择排序法,适用于数据量小,或者有部分数据以及排过序的情况.

代码示例(由小到大排序)

import java.util.Random;

/**
 * 算法大神之路----排序(选择排序法)
 */
public class Study02 {

    public static void main(String[] args) {

        //新建一个数组
        int[] arr = new int[6];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        //使用随机数给数组赋值
            arr[i] = r.nextInt(50);
        }
        System.out.print("原数组为:");
        paint(arr);
        System.out.println("-----排序-----");

        //选择排序法对数据进行排序
        for (int i = 0; i <arr.length; i++) {
            System.out.print("第"+(i+1)+"次扫描");
            for (int j = i+1; j < arr.length; j++) {

                if (arr[j]>=arr[i]) {
                    //拿最前端数据依次同其他数据比较,当其他数据比最前端大的时候,那么不变
                }else{
                    //当其他数据比第一个数据小的时候.交换位置
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
            paint(arr);
        }


    }

    //将数组数据打印至控制台
    public static void paint(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
        System.out.println();
    }

}

控制台打印结果:

原数组为:29    15    2    3    37    39    
-----排序-----
第1次扫描2    29    15    3    37    39    
第2次扫描2    3    29    15    37    39    
第3次扫描2    3    15    29    37    39    
第4次扫描2    3    15    29    37    39    
第5次扫描2    3    15    29    37    39    
第6次扫描2    3    15    29    37    39

总结:选择排序法不管是否中途已经排完毕,都需要经过固定次的扫描,相对于冒泡排序法,扫描次数不能减少.

转载于:https://www.cnblogs.com/wangxinblog/p/7348538.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30302609/article/details/99215690

智能推荐

Hadoop2.7.3 HA模式搭建_若兰幽竹的博客-程序员宅基地

Hadoop2.7.3 HA模式搭建一、集群的规划二、准备工作三、配置Zookeeper四、安装Hadoop集群五、启动Zookeeper集群六、在bigdata112和bigdata113上启动journalnode七、格式化HDFS(在bigdata112上执行)八、在bigdata112上启动Hadoop集群九、在 bigdata113上的ResourceManager需要单独启动说明:为解决Hadoop单点故障问题,需要采用HA模式进行部署环境:VMWare + Centos7 + JDK

50年前发明的CCD图像传感器工作原理图解-程序员宅基地

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达本文转自|新机器视觉1969年,沃勒德‧保尔(Willard Boyle)与乔治‧艾沃德‧史密斯...

java---异常处理(1)-程序员宅基地

Java –异常处理基本概念:当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用。。)时,java就会用异常对象来描述,就是将异常用对象来描述。 两种方法处理异常1, 在发生异常的地方直接处理2, 将异常抛给调用者,让调用者处理这样的代码就会比较健壮,结实。 异常分类1, 检查行异常:java.lang.Exception程...

思科单臂路由与三层交换机配置_三层交换机单臂路由思科_HdLmj的博客-程序员宅基地

注:配置开始前,需要在R1,R2添加网卡用延时线连接,否则上下分开配置后,需要连接时再断电插网卡,再次启动后R1上的配置会失效,所以需要提前插网卡连延时线,或者完成所有配置后再插网卡,但是需要重新配置R1,使用DCE串口线连接R1的S0/0/0端口另一端也连接R2的S0/0/0端口完成后1.配置三层路由器SW1​​​​​​​SW2增加vlan10,vlan20,方式同上开启f0/1的trunk模式将f0/2端口..._三层交换机单臂路由思科

mysql数据库查看时间戳_[数据库]mysql TIMESTAMP(时间戳)详解_Alex lucky的博客-程序员宅基地

[数据库]mysql TIMESTAMP(时间戳)详解0 2012-05-15 12:00:13TIMESTAMP的变体1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 在创建新记录和修改现有记录的时候都对这个数据列刷新2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP 在创..._mysql 显示时间戳

字节跳动历年Java中高级面试题全收录!看完跪了_字节跳动高级java面试-程序员宅基地

如何使用Spring Boot构建微服务体系通过本文内容的学习,你将循序渐进的学习到Spring Boot微框架的设计理念和原理,并对框架重点功能和模块进行逐一详解;其次,你将会学习到如何基于Spring Boot微框架构建一套完整的微服务体系;最后总结Spring Boot相关内容,以温故知新。文档内容分为七大模块,为了方便大家阅读,小编就以截图展示部分内容第1章:了解微服务SpringBoot是一个可使用Java构建微服务的微框架,所以在了解SpringBoot之前,我们需要先了解什么是微服务_字节跳动高级java面试

随便推点

golang学习(一)---------golang的命名规范_golang 包名规范-程序员宅基地

gofmt大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码一致的格式。正常情况下,采用Sublime编写go代码时,插件GoSublilme已经调用gofmt对代码实现了格式化。注释在编码阶段同步写好变量、函数、包注释,注释可以通过godoc导出生成文档。注释必须是完整的句子,以需要注释的内容作为开头,句点作为结尾。程序中每一个被导出的(..._golang 包名规范

Hadoop-2.6.0集群搭建-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

java:动态规划——台阶问题-程序员宅基地

java:台阶问题题目描述前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极AI的研究人员,月神自然去看了此神剧。由于太过兴奋,晚上月神做了一个奇怪的梦,月神梦见自己掉入了一个被施放了魔法的深渊,月神想要爬上此深渊。已知深渊有N层台阶构成(1 <= N <= 1000),并且每次月神仅可往上爬2的整数次幂个台阶(1、2、4、…),请你编程告诉月神,月神有多少种方法爬出深...

LeetCode:989.数组形式的整数加法——简单_Vicky__3021的博客-程序员宅基地

题目:989.数组形式的整数加法对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。示例 1:输入:A = [1,2,0,0], K = 34输出:[1,2,3,4]解释:1200 + 34 = 1234示例 2:输入:A = [2,7,4], K = 181输出:[4,5,5]解释:274 + 181 = 455示例 3:

阿里云免费SSL证书申请及收费版说明-程序员宅基地

网站从HTTP升级到HTTPS,阿小云需要一个SSL证书,阿里云有免费SSL证书可以申请,当然也有收费的,对比了一下阿小云摸了下口袋还是选择了免费SSL证书,另外也给大家整理了收费的SSL证书表,大家对比下:阿里云SSL证书分为收费和免费两种,免费SSL为DV单域名证书,收费SSL证书类型分为DV域名和OV企业型,证书品牌分为Digicert、Rapid、Globalsign、Wosign和vTrus,SSL证书类型不同、品牌不同、域名类型不同费用也不同,阿里云百科来详细说下不同SSL证书收费标准表:从费用

高中计算机专业职业规划2000字,高中人生规划书2000字-程序员宅基地

时间如白驹过隙,我已然成为一位高中生。面对今后的人生选择,我首先需学会规划我的高中三年生活。有了理想人才能够坚持前进,我的目标就是通过三年的努力考上理想的大学。为此我必须刻苦学习,努力拼搏,在高中三年的学习生活中不断学习科学文化知识,发挥优势,弥补劣势,全面发展,成为21世纪的新型人才。我的优势是各科发展均衡,没有明显的偏科。对作业比较认真,上课可以认真听讲,理解和表达能力较强。我的劣势是学习的知...