基本思想

选择排序的思想是:     
给定一个数组arr,其长度为n;        
第一次从 arr[0] 到 arr[n-1] 中选取一个最值(按照需求,可以是最大值,可以是最小值,下同)与arr[0]进行交换;            
第二次从arr[1] 到 arr[n-1]  中选取一个最值与arr[1]进行交换; 
以此类推,直到arr[n-2]到arr[n-1]中选出最值交换后即完成排序。(只剩下一个元素,前面的都是比它小(或者大)的)。

例子

给定数组 arr 为 [ 300, 50 , 120 , 110 ];   
则其初始状态为:

初始状态

定义两个变量minIndexmin,分别表示最小值元素的索引,和最小值元素的值。   
先假定最小值元素为循环开始的第一个元素。 
第一次循环将minIndexmin分别赋值为 0300。 
循环变量为当前元素的下一个元素的索引。   
由图来演示算法过程:   
黄色表示当前循环需要遍历的元素。

第一趟排序

第一趟排序状态1

此时 50  < min当前值300,将minIndex赋值为1,将min赋值为50;

第一趟排序状态2

循环变量向后移动。

第一趟排序状态3

此时 120  > min当前值50,循环变量直接向后移动;

第一趟排序状态4

此时 110  > min当前值50,循环变量无法向后移动,当前循环结束。

minIndex不等于循环开始前的首元素的索引0,发生交换。

第一趟排序状态5

第二趟排序

第二趟排序状态1

此时 120  > min当前值100,循环变量直接向后移动;

第二趟排序状态2

此时 120  > min当前值110,循环变量向后移动则会发生越界,当前循环结束。

minIndex等于循环开始前的首元素的索引1,不发生交换。

第三趟排序

第三趟排序状态1

此时 110  < min当前值120,将minIndex赋值为3,将min赋值为110;

第三趟排序状态2

循环变量再向后移动则会发生越界,当前循环结束。

minIndex不等于循环开始前的首元素的索引2,发生交换。

第三趟排序状态3

因为前n-1个元素均排序完毕,所以原数组排序完毕。

我们由例子可知:
选择排序的趟数为数组长度-1

代码

由上面的讲解知道要写成双重循环,最终代码如下:

import java.util.Arrays;public class Solution {public static void main(String[] args) {int [] arr = new int[]{300,50,120,110};System.out.println("排序前的数组" + Arrays.toString(arr));selectSort(arr);System.out.println("排序前的数组" + Arrays.toString(arr));}public static void selectSort(int[] arr){int minIndex;//最小值元素索引int min;//最小值元素for (int i = 0; i < arr.length - 1; i++) {minIndex = i;min = arr[i];for (int j = i + 1; j < arr.length; j++) {if (min > arr[j]) {min = arr[j];minIndex = j;}}//交换if (minIndex != i) {arr[minIndex] = arr[i];arr[i] = min;}}}
}

时间复杂度

比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+…+1= 。为

稳定性

选择排序是不稳定的排序算法。 
举个例子来说明:   
序列 6 9 6 3 10      
在第一趟排序时第一个6会和3交换位置,那么原序列中两个6的相对前后顺序就被破坏了。   
所以选择排序是一个不稳定的排序算法。

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”喜欢文章,点个在看

【算法知识】详解选择排序算法相关推荐

  1. 【算法知识】详解希尔排序算法

    前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动 ...

  2. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  3. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)

    上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...

  4. DDA画线算法+代码详解-直线扫描算法之一

    #DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...

  5. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

  6. 排序总结(排序算法稳定性、如何选择排序算法以及排序算法常见的坑)

    一.稳定性 处理相等数时的态度,可以决定算法的稳定性 时间复杂度为O(N^2) 空间复杂度O(1)的排序: 选择排序:无稳定性 冒泡排序:有稳定性 插入排序:有稳定性 时间复杂度为O(N*logN)的 ...

  7. 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式

    阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...

  8. 【算法】详解二分查找算法(思路很简单,细节是魔鬼)

    我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...

  9. 【算法知识】详解直接插入排序算法

    前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 在玩扑克牌的时候,我们抽到一张牌的时候,都是将它插入到当前手中牌的合适位置的. 如下图: (上图来自算法导论) 直接插入排序 ...

最新文章

  1. POJ 2947 Widget Factory (高斯消元解同余方程组)
  2. stm32 外部中断学习
  3. 科普 | 5G基站功耗,到底有多可怕?
  4. [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件
  5. pytorch1.7教程实验——对抗示例生成FGSM
  6. CSS3/ 弹性布局flex
  7. python百题百练 二级题目_计算机二级选择题(公共基础新大纲)
  8. php多进程采集百度,php实现多进程下载百度网盘文件
  9. 云计算服务与基本术语、概念
  10. python2打印字符串_Python 3基础教程2-打印语句和字符串
  11. 抓住“智慧城市”的机遇
  12. STM32F030外部中断配置
  13. 电子数字计算机和电子模拟计算机区别,电子数字计算机和电子模拟计算机的区别在哪里?...
  14. 大型文件如何传输到linux服务器,如何从大型机传输PS文件到Linux服务器?
  15. 超级计算机通信工程研发相关高校,[现场]世界大学生超级计算机竞赛ASC的第八年...
  16. 域名申请+云服务器购买+花生壳内网穿透+myeclipse web 登录
  17. 牛文文点评长租公寓行业:过度金融化会毁灭整个行业
  18. 七款酷炫的 Mac 屏保
  19. LiteIDE的sublime黑色 淡绿色 配色文件自定义版本
  20. 计算机信息安全专业主要学习什么,信息安全专业学什么 课程有哪些

热门文章

  1. 数据库菜鸟不可不看 简单SQL语句小结
  2. springboot 集成 swagger 自动生成API文档
  3. anjularjs 路由
  4. python第三方包的windows安装文件exe格式
  5. python numpy创建矩阵、并归一化_每通道以numpy为单位对一批图像进行归一化处理...
  6. 关于html文档,关于HTML的简介
  7. python包括哪些部分_python基础知识部分练习大全
  8. Cadence Orcad元器件位号重排与原理图页序号重排
  9. Qt学习(七):定时器QTimer
  10. 2017年如何成为全栈工程师,这些技能是你必须具备的!