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

news2025/1/18 3:28:41

目录

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秒。


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


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Building3D An Urban-Scale Dataset and Benchmarks 论文阅读

文章主页 Building3D 任务 提出了一个城市规模的数据集&#xff0c;由超过 16 万座建筑物以及相应的点云、网格和线框模型组成&#xff0c;覆盖爱沙尼亚的 16 个城市&#xff0c;面积约 998 平方公里。 动机 现有的3D建模数据集主要集中在家具或汽车等常见物体上。缺乏建…

网络安全快速入门(十)MySQL拓展操作

10.1.0前言 前面我们已经对用户操作以及库&#xff0c;表操作有了基础的认识&#xff0c;接下来我们来在之前已经学过的一些操作进行进一步拓展&#xff0c;本章我们主要了解以下几个知识点&#xff1a; 数据库设计方法视图存储过程事务 我们开始本章的内容吧 10.2 数据库设计方…

string类篇超超超详解,40余个成员函数详细解释(图文)!看完包会!!

本篇目标 constructoroperatorElements accessIteratorsCapacityModifiersString operationsmember contants其他函数 一、constructor(对象的创建) void StrTest1() {string s1;//直接构造cout << s1 << endl;//string里内置了流插入、流提取的函数重载&#xf…

C# 在Excel中添加筛选器并执行筛选 (日期筛选、文本筛选、数字筛选)

自动筛选器是 Excel 中的一个基本但极其有用的功能&#xff0c;它可以让你根据特定的条件来自动隐藏和显示你的数据。当有大量的数据需要处理时&#xff0c;这个功能可以帮你快速找到你需要的信息&#xff0c;从未更加有效地分析和处理相关数据。 下面将介绍如何使用免费.NET …

depcheck检查项目中未被使用的依赖

depcheck是一个用于分析项目中依赖项的工具&#xff0c;可以查看&#xff1a;每个依赖项是如何使用的&#xff0c;哪些依赖项是无用的&#xff0c;以及哪些依赖项在package.json 1、安装 npm install -g depcheck # 必须全局安装2、可配置文件.depcheckrc&#xff08;不配置 直…

SCP收容物171~180

注 &#xff1a;此文接SCP收容物161~170,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-171 scp-172 scp-173 scp-174 scp-175 …

第五十八节 Java设计模式 - 适配器模式

Java设计模式 - 适配器模式 我们在现实生活中使用适配器很多。例如&#xff0c;我们使用存储卡适配器连接存储卡和计算机&#xff0c;因为计算机仅支持一种类型的存储卡&#xff0c;并且我们的卡与计算机不兼容。 适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模…

MySQL用SQL取三列中最大的数据值

1、有如下数据&#xff1a; ABC000097.0600330.72330.720069.650027.8827.85086.92086.92219.42219.4219.41 需要展示为如下形式&#xff1a; ABC结果列0000097.06097.060330.72330.72330.7200669.65009.6527.8827.85027.8886.92086.9286.92219.42219.4219.41219.42 解决办…

OpenText ETX 助力 SMS 集团提高生产力、降低成本并实现全球协作

OpenText ETX 助力 SMS 集团提高生产力、降低成本并实现全球协作 SMS 集团存在的挑战 需要一个可以在全球范围内轻松访问的解决方案&#xff1b;需要一个系统&#xff0c;能够无缝运行图形要求苛刻的基于服务器的应用程序&#xff1b; 结果 1、通过全球用户访问数据&#x…

x264 帧类型代价计算原理:slicetype_slice_cost 函数分析

x264 x264 是一个开源的视频编码库,它实现了H.264/AVC标准。H.264是一种广泛使用的压缩标准,用于视频流、视频下载、蓝光光盘以及许多其他形式的数字视频分发。x264 以其高压缩效率和良好的视频质量而著称,是许多视频编辑软件和视频播放器的默认编解码器。 以下是关于 x26…

做一个属于自己的软件-pyside6快速上手教程

首先环境需要安装python3和pip&#xff0c;软件使用pycharm&#xff0c;安装也都很简单 首先需要安装pyside6,在终端执行&#xff1a; pip install pyside6 然后进入可视化编辑界面 pyside6-designer 进入后创建即可 可以从左侧点击鼠标拉组件进入到中间的工作区&#xff…

服务器通的远程桌面连接不上,关于服务器通畅但远程桌面连接不上问题的专业分析

在日常的企业IT管理中&#xff0c;服务器远程桌面连接是一个重要的操作功能。然而&#xff0c;有时会出现服务器网络通畅&#xff0c;但远程桌面无法连接的情况。 问题分析 1. 防火墙或安全组设置问题&#xff1a;服务器的防火墙或安全组可能阻止了远程桌面连接的端口&#xf…

人工神经网络(科普)

人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN &#xff09;&#xff0c;是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象&#xff0c; 建立某种简单模型&#xff0c;按不同的连接方式组成不同的网络。在工程…

关于使用git拉取gitlab仓库的步骤(解决公钥问题和pytho版本和repo版本不对应的问题)

先获取权限&#xff0c;提交ssh-key 虚拟机连接 GitLab并提交代码_gitlab提交mr-CSDN博客 配置完成上诉步骤之后&#xff0c;执行下列指令进行拉去仓库的内容 sudo apt install repo export PATHpwd/.repo/repo:$PATH python3 "实际路径"/repo init -u ssh://gitxx…

JVM调优工具命令详解(JVM调优看这一篇就够了)

Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 1 jmap ‐histo 14660 #查看历史生成的实例 2 jmap ‐histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc 打开log.txt,文件内容如下: num:序号 instances:实例数量 bytes:占用空间大小 class…

PostgreSQL源码安装

文章目录 一、先决条件检查二、源码安装1、获取源代码2、编译安装1.运行 configure2.运行make 3、PostgreSQL的配置4、安装contrib目录下的工具 三、初始化数据库1、创建数据库管理员2、创建数据库实例3、启动和停止数据库4、设置数据库密码 四、PostgreSQL的简单配置1、pg_hba…

重新定义社交:Facebook的未来愿景与颠覆力量

在当今数字化社会中&#xff0c;Facebook作为全球最大的社交媒体平台&#xff0c;其未来愿景和颠覆力量备受关注。本文将深入探讨Facebook如何重新定义社交&#xff0c;以及其未来发展中的新趋势和影响。 1. 智能化社交体验 Facebook致力于利用人工智能技术提供更智能、个性化…

智慧公厕的未来价值分析和创新设计

智慧公厕正在逐渐成为现代城市建设的重要组成部分。通过全面的数据云端化和自动化技术&#xff0c;智慧公厕实现了高效的数据分析和协作&#xff0c;提升了运行效率和管理水平。未来&#xff0c;智慧公厕将以“景厕融合”的目标发展&#xff0c;结合前沿科技和创新设计&#xf…

数据仓库作业六:第9章 分类规则挖掘

目录 第9章 分类规则挖掘第一题第二题第三题第四题 第9章 分类规则挖掘 第一题 1、设网球俱乐部有打球与气候条件的历史统计数据如下表1所示。它有“天气”、“气温”、“适度”和“风力”4个描述气候的条件属性&#xff0c;类别属性为“是”与“否”的二元取值&#xff0c;分…

【八大排序算法】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 一、排序的相关概念二、排序类型三、排序算法实现插入排序1.直接插入排序2.希尔排序 选择排序3.简单选择排序4.堆排序 交换排序5.冒泡排序6.快速排序递归实现非递归实现 7.归并排序递归实现非递归实现 8.计数排序 四、总结 一、排序的相关概念 排序&#xff1a;根据数…