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

上期冒泡排序传送门:

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图作者)

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

Java排序算法——选择排序(Selection Sort)相关推荐

  1. Java排序算法——选择排序

    Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...

  2. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  3. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  4. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  5. python排序算法-选择排序

    python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...

  6. 排序算法-选择排序-堆排序

    排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...

  7. 排序算法--选择排序(Java实现)

    选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...

  8. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  9. 排序算法——选择排序法(Select Sorting)

    选择排序(Select Sorting) 基本介绍 ​ 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 ​ 选择排序(Selec ...

  10. 数据结构(Java)-排序算法-选择排序

    选择排序: 选择排序也是一种简单的排序方法.它的基本思想是: 对于总共n个元素的数组arr: 第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换, 第二次从arr[1]~arr[n ...

最新文章

  1. 关于unity的一个不错的插件平台
  2. python小学生教材-python纳入小学生教材,以后该如何辅导娃的作业?
  3. 苹果核 - Tangram 的基础 —— vlayout(Android)
  4. Zookeeper的命令
  5. 留言条.html .js来完成
  6. redhat linux加密卷
  7. 怀念童年啊!周二下午没有动画片……
  8. 通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!
  9. EFGrid ---- copy 属性
  10. matlab2c使用c++实现matlab函数系列教程-max函数
  11. win10 x64中 windbg x64 安装配置符号库
  12. 如果开心,就跟着心走吧……
  13. ElasticSearch 安装与API的使用
  14. 工行u盾显示316_企业用户,插U盾点击U盾登录后,显示“无法显示该网页”
  15. linux查看文件打开限制,Linux最大文件打开数使用经验详解
  16. word突然不能保存只能另存为
  17. [转载] python实现语义分割_使用Keras实现深度学习中的一些语义分割模型
  18. 哈工大2022春CSAPP大作业-程序人生(Hello‘s P2P)
  19. Layui数据表格隔行变色的两种方法
  20. 获取今日时间范围区间

热门文章

  1. 天翼校园客户端linux,GitHub - YianAndCode/f-surfing: 佛大广东天翼校园客户端在 Linux 下的解决方案...
  2. 重新认识下科技核心目录吧!附容易发的期刊名单
  3. 帆软:像阿甘一样,奔跑在商业智能的赛道上!
  4. 弹窗整人php源码,整人无限弹窗[附源码]
  5. DSP28335学习——系统初始化
  6. Linux内核源码目录
  7. 测试鼠标传感器的软件,光电鼠标传感器的精密测量与控制系统 - 嵌入式设计应用 - 电子发烧友网...
  8. 2022下半年软件设计师资源分享
  9. JanusGraph
  10. c语言作业百万富翁for循环做,c语言例题(c语言经典例题100道pdf)