数据结构与算法-排序算法2-选择排序

目录

1.选择排序:

1.介绍:

2.动态图解

3.举例

4.小结选择排序规则

5.选择排序代码

6.运行时间

代码:

运行结果:


1.排序算法简介

排序也称为排序算法。排序是将一组数据依据指定的顺序进行排列的过程。

2.常见的排序算法分类如下图:

稳定性口诀:

选泡插,快归堆希桶计基,不稳稳稳不稳稳,不稳不稳稳稳稳

3.选择排序:

1.介绍:

数组中n个元素,从数组第一个元素开始到最后一个元素,第一次从arr[0]到arr[n-1]中选取最小值min1,如果min1不等于arr[0],就将min1与arr[0]交换。接着对右边n-1个元素也这样,第二次找到这n-1个元素中的最小值min2,比较min2与arr[1],如果不相等就交换。依此类推,第i次从arr[i-1]到arr[n-1]中找到最小值mini,与arr[i-1]比较,如果不相等就交换;第n-1次从arr[n-2]到arr[n-1]中选最小值minn-1,比较minn-1与arr[n-2],如果不相等就交换。直到整个数组从小到大排列。总共n-1次。

选择排序是从左到右找到位置对应的元素。

2.动态图解

3.举例

比如原始数组为:8,3,2,1,7,4,6,5

第一趟排序:1,3,2,8,7,4,6,5 因为第一次从arr[0]到arr[n-1],最小为1,所以1和arr[0]也就是8交换,1变成arr[0]

第二趟排序:1,2,3,8,7,4,6,5 因为后面7个数中2最小,与arr[1]比较,2比arr[1]小,所以交换,2变成arr[1]

第三趟排序:1,2,3,8,7,4,6,5 因为3是后面6个数中最小的,并且就是arr[2],所以不用交换

第四趟排序:1,2,3,4,7,8,6,5 因为4是后面5个数中最小的,与arr[3]比较,4比arr[3]小,所以交换,4变成arr[3]

第五趟排序:1,2,3,4,5,8,6,7 因为5是后面4个数中最小的,与arr[4]比较,5比arr[4]小,所以交换,5变成arr[4]

第六趟排序:1,2,3,4,5,6,8,7 因为6是后面3个数中最小的,与arr[5]比较,6比arr[5]小,所以交换,6变成arr[5]

第七趟排序:1,2,3,4,5,6,7,8 因为7是后面2个数中最小的,与arr[6]比较,7比arr[6]小,所以交换,7变成arr[6]

4.小结选择排序规则

①数组元素个数为n,就一共进行n-1次大循环

②每一趟排序又是一个循环:

先假定当前这个数是最小值,然后和后面每个数进行比较,如果有比当前数更小的数,就重新确定最小值,并且得到下标。遍历到数组最后就得到本趟的最小值和下标。然后就可以对最小值和应该在的位置的数比较看要不要交换。交换的话就让数组中下标为最小值所在位置的元素的值变成正在排的下标的元素的值。用把元素放在对应位置的想法,比如正在排i这个位置,找i这个位置应该对应的元素,arr[minIndex]=arr[i],这是把原来i位置的元素放到找到最小值的位置。arr[i]=min,这是把min放在正在排的这个位置。

5.选择排序代码

包括推导代码和最终代码

package com.xjj.sort;

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int arr[]={8,3,2,1,7,4,6,5};
        selectSort(arr);
    }
    //选择排序-找过程
    public static void selectSort1(int[] arr){
        //第一轮
        int min=arr[0];
        int minIndex=0;
        //先和第二个数比较
        for(int i=1;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[0],也就是交换
        if(minIndex!=0){
            arr[minIndex]=arr[0];//把原来的arr[0]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[0]=min;//将最小值放在arr[0]
        }
        System.out.println("第一轮:"+Arrays.toString(arr));

        //第二轮
        min=arr[1];
        minIndex=1;
        for(int i=2;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[1],也就是交换
        if(minIndex!=1){
            arr[minIndex]=arr[1];//把原来的arr[1]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[1]=min;//将最小值放在arr[1]
        }
        System.out.println("第二轮:"+Arrays.toString(arr));

        //第三轮
        min=arr[2];
        minIndex=2;
        for(int i=3;i<arr.length;i++){
            if(min>arr[i]){
                min=arr[i];//min变成arr[i]
                minIndex=i;//下标变成i
            }
        }
        //将最小值放在arr[2],也就是交换
        if(minIndex!=2){
            arr[minIndex]=arr[2];//把原来的arr[0]位置的值变成刚才记录的下标,也就是找到最小值的位置
            arr[2]=min;//将最小值放在arr[0]
        }
        System.out.println("第三轮:"+Arrays.toString(arr));
        //写了三轮发现和推导时结果一样,不写了
        /*
        第一轮:[1, 3, 2, 8, 7, 4, 6, 5]
        第二轮:[1, 2, 3, 8, 7, 4, 6, 5]
        第三轮:[1, 2, 3, 8, 7, 4, 6, 5]
        */
    }
    //找到规律后就用两层循环写
    public static void selectSort(int[] arr){
        for(int j=0;j<arr.length-1;j++){
            int min=arr[j];
            int minIndex=j;
            for(int i=j+1;i<arr.length;i++){
                if(min>arr[i]){
                    min=arr[i];
                    minIndex=i;
                }
            }
            if(minIndex!=j){ //不相等才交换,也就是不在应该的位置就交换
                arr[minIndex]=arr[j];
                arr[j]=min;
            }
            System.out.println("第"+(j+1)+"轮:"+Arrays.toString(arr));
        }
    }
}

运行结果:

6.运行时间

插入段记录时间的代码。排序前记一次时间,排序后记一次时间。

然后输出元素的代码就先注释掉。

代码:

package com.xjj.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class SelectSort {
    public static void main(String[] args) {
//        int arr[]={8,3,2,1,7,4,6,5};
//        selectSort(arr);
        int arr2[]=new int[80000];
        for(int i=0;i<80000;i++){
            arr2[i]=(int)(Math.random()*80000);
        }
        Date date1=new Date();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str=simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:"+date1Str);
        selectSort(arr2);
        Date date2=new Date();
        String date2Str=simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:"+date2Str);
    }
    //找到规律后就用两层循环写
    public static void selectSort(int[] arr){
        for(int j=0;j<arr.length-1;j++){
            int min=arr[j];
            int minIndex=j;
            for(int i=j+1;i<arr.length;i++){
                if(min>arr[i]){
                    min=arr[i];
                    minIndex=i;
                }
            }
            if(minIndex!=j){//不相等才交换,也就是不在应该的位置就交换
                arr[minIndex]=arr[j];
                arr[j]=min;
            }
//            System.out.println("第"+(j+1)+"轮:"+Arrays.toString(arr));
        }
    }
}

运行结果:

80000个元素,选择排序运行时间2秒。


记住:选择排序是从左到右找到位置对应的元素。


后面会继续写插入排序等排序算法的内容。分类排序部分写完之后再给出一些题目练习^_^加油加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/624875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django图书馆综合项目-学习(2)

接下来我们来实现一下图书管理系统的一些相关功能 1.在书籍的book_index.html中有一个"查看所有书毂"的超链接按钮&#xff0c;点击进入书籍列表book_list.html页面. 这边我们使用之前创建的命名空间去创建超连接 这里的book 是在根路由创建的namespacelist是在bo…

图搜索算法-最短路径算法-戴克斯特拉算法

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 图搜索算法 - 拓扑排序 最短路径算法 自从有了导航&#xff0c;人们再也不怕去陌生地方&#xff0c;说走就走的旅…

mysql查询优化索引篇

其实在写这篇文章之前,也对查询优化做过一些设置,但这次则更为具体一点,之前做的无非就是增加查询字段的索引,让select里和where里的内容全部都包含在索引内(覆盖索引不走回表的基本概念),但这次这么做的时候发现了一些问题,这也是我接下来要提到的,而且之前使用的是sqlserver的…

【生信技能树】GEO数据挖掘全流程

R包的安装&#xff0c;每次做分析的时候先运行这段代码把R包都安装好了&#xff0c;这段代码不需要任何改动&#xff0c;每次分析直接运行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

苹果M4芯片:大模型本地运算的转折点

在人工智能和机器学习领域&#xff0c;大模型的兴起对硬件提出了前所未有的挑战。苹果公司最近推出的M4芯片&#xff0c;被视为其在这场竞赛中的“第一式”。本文将探讨M4芯片的特点&#xff0c;并与其他芯片进行比较。 M4芯片的亮点 Neural Engine算力&#xff1a;M4芯片的…

OpenStack虚拟机管理实例

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、OpenStack计算服务 1、什么是Nova 2、Nova所用的虚拟技术 3、Nova的系统架构 4、虚拟机实例化流程 一、示例 1、验证Nova服务 2、试…

柔性数组+结构体类型转换

柔性数组&#xff1a;在结构体中声明的时候仅作为占位符&#xff0c;好处是地址是连续的 强制类型转换&#xff1a;可用于通信双方进行信息交流 #include <iostream> #include <string.h>struct DataWater {int count;float size;char buf[0]; }; // dbuf相当于是…

传输文件协议FTP与LFTP

目录 一.简介 二. FTP基础 主动模式&#xff08;Active Mode&#xff09;&#xff1a; 被动模式&#xff08;Passive Mode&#xff09;&#xff1a; 三. Vsftp 服务器简介 四. Vsftpd配置 1. 安装vsftpd&#xff08;ftp服务端&#xff09; 2.编辑配置文件 &#xff08;…

视频汇聚管理/安防监控系统EasyCVR如何开启和调用验证码登录接口?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传统安防视…

【补充】图神经网络前传——Node2vec

Node2Vec【图神经网络论文精读】_哔哩哔哩_bilibili 解决的问题&#xff1a;图嵌入 把每一个节点编码成一个d维的低维、稠密&#xff08;不是one-hot&#xff09;、连续&#xff08;不是离散的&#xff0c;是实数->有助于保存更多的信息&#xff09;向量&#xff0c;并且&a…

安装Tomcat

下载 Tomcat 软件包 前往 Apache Tomcat 官网:Apache Tomcat - Apache Tomcat 10 Software Downloads在网站上找到最新版本的 Tomcat&#xff0c;选择下载对应的压缩包&#xff08;通常是 .zip 或 .tar.gz 格式&#xff09;。下载完成后&#xff0c;解压缩到您选择的目录。 配…

【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手

文章目录 一、前言二、绘制效果三、ConstraintLayout 使用方法3.1 创建布局文件3.2 替换配置3.3 设置约束&#xff0c;步骤13.4 设置约束&#xff0c;步骤23.5 其他设置 四、结束 一、前言 在进行Android APP开发过程中&#xff0c;减少layout嵌套即可改善UI的绘制性能&#x…

考研数学|强化《660》+《880》这样刷,太丝滑了❗️

660题880题需要大概两个月才能做完 660题和880题都是很高质量的题集&#xff0c;所以做起来一点也不轻松。 每年都会有学生暑假两个月只做了一本660题的情况&#xff0c;因为题目实在是太难&#xff0c;有点做不下去的感觉。 不过不要担心&#xff0c;暑假就是刷题发现问题的…

一个小调整,竟然让交换机、路由器的CPU占用率降低了50%

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 在信息时代下&#xff0c;不仅仅在网络工程领域&#xff0c;高CPU占用率都是一个非常常见的问题&#xff0c;…

ESP32-S3+86盒线控器方案,含开发时问题技术解答

随着智能家居产品越来越多&#xff0c;线控器应用也加大&#xff0c;86盒线控器跟智能吹风机联动&#xff0c;跟中央空调联动&#xff0c;下面讲下ESP32-S386盒线控器方案在开发中遇到的问题。 一、ESP32-S386盒线控器方案&#xff1a; 1、无需网关&#xff0c;可以直接连家里…

Flutter 玩转动画 + 自定义View 实现积分或金币领取流程动画

一、效果图 二、主要涉及的知识点 AnimationController、Animation、FractionalTranslation 动画Api的运用CustomPainter 自定义View以及每个时机的把握 主要是写篇博客来记录一下这个功能的实现&#xff0c;具体代码就看源代码了&#xff0c;有疑问可以私信沟通 源代码下载…

【高阶数据结构】并查集 {并查集原理;并查集优化;并查集实现;并查集应用}

一、并查集原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类…

Java的类和对象(一)—— 初始类和对象,this关键字,构造方法

前言 从这篇文章开始&#xff0c;我们就进入到了JavaSE的核心部分。这篇文章是Java类和对象的第一篇&#xff0c;主要介绍类和对象的概念&#xff0c;this关键字以及构造方法~~ 什么是类&#xff1f;什么是对象&#xff1f; 学过C语言的老铁们&#xff0c;可以类比struct自定义…

弹幕游戏-压力测试 Python-Locust模拟送礼物

Hey&#xff0c;读者们&#xff01;今天给大家带来一个Python性能测试的新玩法——使用Locust模拟发送礼物。是不是听起来就很酷&#xff1f;&#x1f60e; &#x1f3af;目标 想象一下&#xff0c;在直播平台上&#xff0c;你希望测试某个直播间的礼物发送功能。那么&#x…

通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证&#xff0c;测试模型的可优化方向。下面是代码的详细情况 代码实现 from datasets import load_dataset from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArgum…