Java排序算法——选择排序(Selection Sort)

article/2025/10/24 18:50:50

上次总结了一下冒泡排序,这次来看看同样非常简单的选择排序

上期冒泡排序传送门:

Java排序算法——冒泡排序(Bubble Sort)https://blog.csdn.net/babbfqb93/article/details/123005968?spm=1001.2014.3001.5501

选择排序(Selection Sort)就是通过选择一个数组中的最大(小)值排序到数组的头部位置(和头部位置交换)接下来循环剩余数组找到次最大(小)值排序到第二的位置,以此类推,直到所有的数字都被选择完成之后完成排序。整体效果如下图:

上图是全部的一个过程,总体的来说,为了方便理解,我们解析一下过程。 

首先还是看一下内层的第一次循环:

图片如下:

可以看到,第一次循环确定所有数组中的最小值为14,所以将14于第一个位置的20进行交换,我们把实现的代码逻辑展示一下:

在展示初始化逻辑之前,我们先需要对于数组的初始化和数组元素交换方法做一个简单的封装:

 首先是初始化数组的逻辑:

//初始换一个长度为参数的随机数组,数组元素为0(含)到50(不含)的随机数
public static int[] initArray(int length){Random r = new Random();//申明并实例化一个Random对象int[] iArray = new int[length];//申明并实例化一个int数组用于测试排序for (int i = 0; i < iArray.length; i++) {//通过Random随机生成一个0(含)到50(不含)的数并插入对应位置iArray[i] = r.nextInt(50);}return iArray;
}

接下来是下面是交换2个下标位置元素的方法:

//交换传递数组下表的i与j元素的交换
public static void swap(int[] iArray,int i,int j){int tmp = iArray[i];iArray[i] = iArray[j];iArray[j] = tmp;
}

好了,有了这两个方法,我们就可以安心实现选择排序了,先是通过第一层逻辑,将逻辑代码写出来:

//选择排序
public static void selectionSort(int[] iArray) {//若传递的数组为空,或者长度1则直接返回if (iArray == null || iArray.length < 2) {return;}//这个值用来当前循环获取到的最小值的一个下标数int minIndex = 0;//循环整体的数组,比较找到最小元素的下标for (int i = 0; i < iArray.length - 1; i++) {//若当前元素比存储下标的元素小,则存储当前下标if (iArray[i] < iArray[minIndex]) {//存储当前下标minIndex = i;}}//将首位数与最小数交换swap(iArray, 0, minIndex);
}

以上为第一层循环的逻辑,也可以理解为内层循环的逻辑,接下来我们需要的便利整个数组,将每个位置都确定为剩余数组元素的最小值,我们也和冒泡排序一样,使用嵌套for循环的方式实现,

 每个框对应的都是一层外部循环,所以可以看出是从0开始,循环次数为总体数组长度-1,我们在写外层的同时,将内层逻辑修改,内层的起点我们之前最开始是从0开始,现在我们应该是从外层循环的循环次数+1开始(因为我们可以把外层循环次数设置为默认的最小值,还是用代码来写比较清楚一些(代码中有注释))

//选择排序
public static void selectionSort(int[] iArray) {//若传递的数组为空,或者长度1则直接返回if (iArray == null || iArray.length < 2) {return;}for(int i = 0 ;i<iArray.length-1;i++){//从外层循环次数设置为初始值,这样可以减少一次内层循环int minIndex = i;//存储当前循环获取到的最小值的一个下标数//循环整体的数组,比较找到最小元素的下标//起点为外层循环+1,因为每一次外层循环都确定第i个下标为当前最小值for (int j = i+1; j < iArray.length; j++) {//若当前元素比存储下标的元素小,则存储当前下标if (iArray[j] < iArray[minIndex]) {//存储当前下标minIndex = j;}}//若下标为最小值,则不交换if(i!=minIndex) {//将当前循环的下标位置数与最小数交换swap(iArray, i, minIndex);}}
}

以上便是封装好的一套选择排序了,我们可以写一个测试入口:

public static void main(String[] args) {//初始化数组int[] iArray = initArray(7);//输出排序前结果System.out.println("------排序之前------");System.out.println(Arrays.toString(iArray));System.out.println("-------------------");//排序...System.out.println("------正在排序------");selectionSort(iArray);System.out.println("-------------------");//输出排序后结果System.out.println("------排序之后------");System.out.println(Arrays.toString(iArray));System.out.println("-------------------");
}

可以看到运行之后达到预期了。

引用一下个人查询到的相关gif,帮助大家总结一下(我实在找不到gif的作者,这个图用于学习真的很棒!感谢gif图作者)

 好,我说完了。记得关注,点赞,我会在之后更新更多内容......


http://chatgpt.dhexx.cn/article/g7DEarFw.shtml

相关文章

选择排序——Java排序算法

选择排序 选择排序&#xff08;SelectSort&#xff09;选择排序是所有排序中最简单的排序算法之一&#xff0c;同时也是要求我们必须掌握的排序算法之一。 时间复杂度 选择排序的时间复杂度为(n2) 算法步骤 1.在未排序的序列中找到最小或者最大的元素&#xff0c;存放到排…

java 排序api_JAVA排序算法API

上一个类 下一个类 框架 无框架 摘要&#xff1a; 嵌套 | 字段 | 构造函数 | 方法 详细信息&#xff1a; 字段 | 构造函数 | 方法 org.luosijin.test 类 Sort java.lang.Object org.luosijin.test.Sort public class Sort extends java.lang.Object Java实现几种常见排序方…

Java排序算法

7.1 排序算法的介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 7.2 排序的分类 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法&#xff1a; 数据量过大&#xff0c;无法全…

常见几种java排序算法

常见几种java排序算法 0. 总览时间复杂度和稳定性 1.插入排序2.分治排序法,快速排序法3.冒泡排序 low版4.冒泡排序 bigger版5.选择排序6. 归并排序8. 堆排序踩坑v1.0 巨慢不能用v2.0 太慢不能用v3.0 9. 其他排序7. 比较 0. 总览 时间复杂度和稳定性 平均最好最差稳定性冒泡n2…

Java常用实现八种排序算法与代码实现

一、交换排序 所谓交换&#xff0c;就是序列中任意两个元素进行比较&#xff0c;根据比较结果来交换各自在序列中的位置&#xff0c;以此达到排序的目的。 1. 冒泡排序 冒泡排序是一种简单的交换排序算法&#xff0c;以升序排序为例&#xff0c;其核心思想是&#xff1a; 从…

十大经典排序算法——java语言

文章目录 一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序 一、冒泡排序 概述&#xff1a; 冒泡排序是一种简单直观的排序算法。它重复的走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;按…

Java常见排序算法

目录 1、归并排序 2、堆排序 3、基数排序 4、冒泡排序 5、希尔排序 6、快速排序 7、插入排序 8、选择排序 1、归并排序 1、基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治&#xff08;divide-a…

java实现七种经典排序算法

简单算法&#xff1a;冒泡&#xff0c;简单选择&#xff0c;直接插入 改进算法&#xff1a;希尔&#xff0c;堆&#xff0c;归并&#xff0c;快速 直接插入排序&#xff1a;将一个记录插入到已经拍好的有序列表中&#xff0c;从而得到一个新的、记录数增加1的有序表。 冒泡排…

java实现10种排序算法

1.冒泡排序(Bubble Sort) import java.util.Arrays; //冒泡排序 public class BubbleSort_01 {public static void main(String[] args) {int a[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//记录比较次数int count0;//i0,第一轮比较for (int i 0; i < a.length-1; i) {…

SQL sever数据库触发器设计

SQL sever数据库触发器设计 一、目的: 能够理解触发器调用的机制。能够使用SQL命令创建DML触发器。能够完成触发器的修改、删除等管理任务。 二、触发器: 定义&#xff1a;触发器&#xff08; T rigger &#xff09;是 SQL server 提供给程序员和数据分析员来保证数据完整性…

MySQL——超详细数据库触发器教程

目录 一、触发器的概念 二、创建触发器 三、查看触发器 四、删除触发器 总结 一、触发器的概念 在实际开发中往往会碰到这样的情况&#xff1a; 当我们对一个表进行数据操作时&#xff0c;需要同步对其它的表执行相应的操作&#xff0c;正常情况下&#xff0c;如果我们使用…

关于数据库触发器(trigger)的简单使用操作

最近在做一些东西&#xff0c;用到关于数据库触发器的简单使用。比如当我们在做用户模块的表设计的时候&#xff0c;我们建了联用户信息表&#xff08;t_user&#xff09;和账号表&#xff08;t_account&#xff09;&#xff0c;账号表&#xff08;t_account&#xff09;用来进…

MySQL数据库触发器

MySQL 数据库中触发器是一个特殊的存储过程&#xff0c;不同的是执行存储过程要使用 CALL 语句来调用&#xff0c;而触发器的 执行不需要使用 CALL 语句来调用&#xff0c;也不需要手工启动&#xff0c;只要一个预定义的事件发生就会被 MySQL自动调用 引发触发器执行的事件一般…

mysql数据库触发器失效,mysql 的数据库触发器解决方法

mysql 的数据库触发器 我要做一个数据库触发器&#xff0c;当删除数据库中的某一张表的时候触发这个一个事件&#xff0c;删除其他表中的某一些数据。 大家给个例子 ------解决方案-------------------- MYSQL官方免费手册中已经有现成的例子了。 CREATE TABLE test1(a1 INT); …

什么是数据库触发器?

目录 什么是数据库触发器&#xff1f; 事件 AFTER触发器 INSTEAD OF触发器 特殊数据库对象 定义 用于触发器 复杂的审计 执行业务规则 派生列值 触发器很棘手&#xff01; 什么是数据库触发器&#xff1f; 数据库触发器是在数据库中发生特定操作时运行的特殊存储过…

Oracle数据库 触发器

文章目录 一、触发器的定义二、触发器的分类三、触发器的功能四、触发器的语法五、触发器的使用案例案例1&#xff1a;向emp1表中插入一条数据后输出 欢迎加入 语句案例2&#xff1a;数据校验&#xff0c;在周四这一天不允许向emp1表中插入/更新数据案例3&#xff1a;创建触发器…

数据库之触发器详解

一、触发器的概念 触发器是与表有关的数据库对象&#xff0c;在满足定义条件时触发&#xff0c;并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。 举个例子&#xff0c;比如你现在有两个表【用户表】和【日志表】&#xff0c;当一个…

数据库-触发器

目录 1. 触发器概述 2. 触发器的创建 2.1 创建触发器语法 3. 查看、删除触发器 3.2 删除触发器 4. 触发器的优缺点 4.2 缺点 4.3 注意点 在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如 商品信息 和 库存信…

触发器(数据库必学)

文章目录 概念注意 优缺点优点缺点 语法参数说明 查看触发器删除触发器实例实际应用注意重新编辑拓展不能对同一张表进行修改 概念 触发器是一种特殊类型的存储过程&#xff0c;它不同于存储过程&#xff0c;主要是通过事件触发而被执行的。而存储过程则需要主动调用其名字执行…

C语言实现字符串逆序、倒置字符串(字符串逆序问题的升级)

一.字符串逆序 问题描述&#xff1a; 输入一个字符串str&#xff0c;将其内容颠倒过来&#xff0c;并输出。 数据范围0<len(str)<10000 输入描述&#xff1a; 输入一个字符串&#xff0c;可以有空格 输出描述&#xff1a; 输出逆序的字符串 输入样例&#xff1a; …