数据结构与算法-排序算法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秒。


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


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

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

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

相关文章

国内好用的测试用例管理工具有哪些?

目前市面上的测试用例管理工具有很多&#xff0c;但由于针对的项目、领域、目标用户&#xff0c;功能也并不一致&#xff0c;所以选择一款适合的测试管理平台并不轻松。做好这件事&#xff0c;首先要需求明确你用测试管理工具干什么&#xff1f;最终想要达到什么目标&#xff1…

vue2人力资源项目8员工详情

页面结构 <template><div class"dashboard-container"><div class"app-container"><div class"edit-form"><el-form ref"userForm" label-width"220px"><!-- 姓名 部门 --><el-row…

【科研】常用的实验结果评价指标(2) —— MAE 是什么? !

了解MAE 提示&#xff1a;先说概念&#xff0c;后续再陆续上代码 文章目录 了解MAE前言一、MAE 基本概念1. MAE 是什么&#xff1f;2. MAE 的起源3. MAE 的计算公式 二、MAE的适用场景是什么&#xff1f;三、MAE 的劣势&#xff0c;或 不适用于那些场景或者数据&#xff1f;四、…

Linux修炼之路之yum和vim编辑器

目录 一&#xff1a;Linux软件包管理器yum 二&#xff1a;vim编辑器 vim的三种模式及互相转换 命令模式 底行模式 三&#xff1a;普通用户的sudo指令(修改信任名单) 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a…

c++编程(11)——string类的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言string类的模拟实现string的成员对象构造、赋值、析构访问成员对象的接口访问字符串中的元素迭代器对字符序列的插入、删除元素操作mystring类的相关操作 mystring类的所有模拟实现以及测试案例 前言 本…

【已解决】 ‘Conv2d’ object has no attribute ‘register_full_backward_hook’

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

(四十二)第 6 章 树和二叉树(树的二叉链表(孩子-兄弟)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

centos7中如何优雅的动态切换jdk版本?

在 CentOS 7 中动态切换 JDK 版本可以通过多种方法实现&#xff0c;其中最常见的方法是使用 alternatives 命令&#xff0c;这是 CentOS 和其他基于 Red Hat 的系统中用于管理多个软件版本的标准工具。下面我会详细介绍如何使用 alternatives 命令来切换 JDK 版本。 步骤 1: 安…

【JS面试题】this

this取什么值&#xff0c;是在函数执行的时候确定的&#xff0c;不是在函数定义的时候确定的&#xff01; this的6种使用场景&#xff1a; ① 在普通函数中使用&#xff1a;返回window对象 ② 使用call apply bind 调用&#xff1a;绑定的是哪个对象就返回哪个对象 ③ 在对象…

怎样计算Excel一列数值中十位数为5的个数?

有一列数字&#xff0c;可能正数也可能是负数&#xff0c;有可能有小数&#xff0c;要怎么计算这列数字中十位数为5的数量有多少个&#xff1f; 一、按示例情况&#xff0c;数字均为整数 公式如下&#xff1a; SUM(--(MID(A1:A6,LEN(A1:A6)-1,1)"5")) 数组公式&a…

一台linux通过另一台linux访问互联网-TinyProxy

参考&#xff1a; https://blog.csdn.net/weixin_41831919/article/details/113061317https://www.yuncongz.com/archives/1.htmlhttps://blog.csdn.net/aoc68397/article/details/101893369 环境&#xff1a;ubuntu 18.04 机器1: IP 219.216.65.252 (可以访问外网) 机器2: IP…

【C++语言】动态内存管理

文章目录 前言内存管理数据存储位置C语言动态内存管理方式C动态内存管理方式&#xff1a;new/deleteoperator new与operator delete函数new和delete的实现原理定位new表达式&#xff08;了解&#xff09;常见面试题 总结C语言系列学习目录 前言 本章要介绍的是动态内存管理&am…

学习神经网络基础架构

今日学习了解了常见的几种神经网络基础架构。 1.卷积神经网络 卷积神经网络CNN是一种人工神经网络&#xff0c;旨在处理和分析具有网格状拓扑结构的数据&#xff0c;如图像和视频。将 CNN 想象成一个多层过滤器&#xff0c;可处理图像以提取有意义的特征并进行推理预测。 想…

PG数据文件和块管理与Oracle比较

之前有说过PG数据库中的对象oid与数据文件一一对应&#xff0c;创建的数据库如果没有指定表空间&#xff0c;则会默认放在默认表空间中&#xff0c;例如&#xff1a; 1.对象OID与数据文件对应关系 Oracle的逻辑与物理对应关系如下&#xff1a; 两种结果相比较而言&#xff1a; …

赋能业务全球化,明道云HAP通过亚马逊云科技 FTR认证

近日&#xff0c;明道云作为融合多元能力的超级应用平台&#xff0c;成功通过了AWS&#xff08;Amazon Web Service&#xff09;的FTR&#xff08;Foundational Technical Review&#xff09;认证。FTR是亚马逊云科技为合作伙伴解决方案提供的一项全面技术审核机制&#xff0c;…

Python 操作数据库

十、Python3 操作数据库 1、Python3 操作 MySQL 1、基本介绍 Python3 操作 MySQL 数据库 可以使用的模块是 pymysql 和 MySQLdb。 这个两个模块都是通过自己的 API 执行原生的 SQL 语句实现的。 MySQLdb 是最早出现的一个操作 MySQL 数据库的模块&#xff0c;核心由C语言编…

【NodeMCU实时天气时钟温湿度项目 7】和风天气API返回JSON数据信息的解压缩实现——ArduinoUZlib功能库

今天是第七专题&#xff0c;主要内容是&#xff1a;导入ArduinoUZlib功能库&#xff0c;借助该库把从【和风天气】官网返回的经过Gzip压缩的JSON数据&#xff0c;进行解压缩和t解析&#xff0c;在串口监视器上输出解析后的JSON信息。 如您需要了解其它专题的内容&#xff0c;请…

C++:编程世界的永恒之石

在编程的广袤领域中&#xff0c;C犹如一块永恒的基石&#xff0c;历经岁月的洗礼&#xff0c;依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域&#xff0c;使其成为无数程序员心中的信仰与追求。 一、C&#xff1a;历史与传承的交汇点 C的历史可追溯到上世纪80年代&…

由于安全设置错误,远程桌面连接失败怎么办?

问题&#xff1a;远程桌面安全设置错误&#xff1f; “我是一名IT经理&#xff0c;需要经常使用远程桌面连接到办公室的电脑。近期&#xff0c;我在使用远程桌面时&#xff0c;远程桌面提示‘由于安全设置错误&#xff0c;客户端无法连接到远程计算机。’我不清楚是什么原因所…

哪些软件格式在win跟linux上都能运行?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 有一些软件格式在Windows和Li…