原理

选择排序,是冒泡排序的优化。

每一趟只交换一次。就是选择最大(或者最小的)和首位交换。

例子

现有无序数组[6 5 4 1 8 9]

第一趟找到最小数1,放到最前边(与首位数字交换)

交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

第二趟找到余下数字[5 4 6 8 9]里的最小数4,与当前剩余数组的首位数字进行交换

交换前:| 1 | 5 | 4 | 6 | 8 | 9 |

交换后:| 1 | 4 | 5 | 6 | 8 | 9 |

第三趟继续找到剩余[5 6 8 9]数字里的最小数5,实际没有交换,5在首位置无须交换

第四趟从剩余的[6 8 9]里找到最小数6,实际没有交换

第五趟从剩余的[8 9]里找到最小数8,发现它在正确的位置,没有交换

排序完毕输出正确结果| 1 | 4 | 5 | 6 | 8 | 9 |

第一趟找到最小数1的细节

当前数组是| 6 | 5 | 4 | 1 | 8 | 9 |

先把6取出来,让它扮演最小数

当前最小数6与其它数一一进行比较,发现更小数就交换角色

当前最小数6与5比较,发现更小数,交换角色,此时最小数是5,接下来5与剩余数字比较

当前最小数5与4比较,发现更小数,交换角色,此时最小数是4,接下来4与剩余数字比较

当前最小数4与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

当前最小数1与8比较,不动

当前最小数1与9比较,不动,到达末尾

当前最小数1与当前首位数字进行位置交换,如下所示

交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

完成一趟排序,其余步骤类似

参考代码

/*** @Description:简单选择排序算法的实现*/
public class SelectSort {// -------------------------------------------------------// 第一趟排序: 原始数据:5 2 8 4 9 1// 最小数据1,把1放在首位,也就是1和5互换位置,// 排序结果:1 2 8 4 9 5// -------------------------------------------------------// 第二趟排序:// 第1以外的数据{2 8 4 9 5}进行比较,2最小,// 排序结果:1 2 8 4 9 5// -------------------------------------------------------// 第三趟排序:// 除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换// 排序结果:1 2 4 8 9 5// -------------------------------------------------------// 第四趟排序:// 除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换// 排序结果:1 2 4 5 9 8// -------------------------------------------------------// 第五趟排序:// 除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换// 排序结果:1 2 4 5 8 9// ------------------------------------------------------public static void selectSort(int[] arr) {if (arr == null || arr.length == 0)return;int minIndex = 0;// 选择排序,是冒泡排序的优化for (int i = 0; i < arr.length; i++) {// 只需要比较n-1次System.out.println("i======" + i);minIndex = i;for (int j = i + 1; j < arr.length; j++) {// 从i+1开始比较,因为minIndex默认为i了,i就没必要比了。System.out.println("j======" + j);if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex != i) { // 如果minIndex不为i,说明找到了更小的值,交换之。
                swap(arr, i, minIndex);}}System.out.println("结果为==========================");for (int i : arr) {System.out.println(i);}}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {int[] arr = { 8, 10, 2, 1, 5, 4 };new SelectSort().selectSort(arr);}}

转载于:https://www.cnblogs.com/llq1214/p/9717661.html

选择排序--Selection sort相关推荐

  1. C语言选择排序Selection sort算法(附完整源码)

    选择排序Selection sort算法 选择排序Selection sort算法的完整源码(定义,实现,main函数测试) 选择排序Selection sort算法的完整源码(定义,实现,main函 ...

  2. 【排序算法】选择排序(Selection sort)

    选择排序(Selection sort)是一种简单直观的排序算法. 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余未排序的元 ...

  3. 排序之选择排序(Selection sort)

    文章目录 1 基本思想 2 图示 3 代码 4 测试结果 5 时间复杂度及稳定性 以前了解过的排序算法,发现长时间不用之后,有些遗忘,特此记录一下,待遗忘时候可以再查阅一下 1 基本思想 N个数据,每 ...

  4. 内部排序 (四):选择排序 Selection Sorting (简单选择排序、堆排序)

    作为数据结构的课程笔记,以便查阅.如有出错的地方,还请多多指正! 目录 简单选择排序 Simple Selection Sort 排序过程 算法实现 算法评价 T(n) S(n) 是否稳定 堆排序 H ...

  5. 基本排序算法01----选择排序(selection sort)

    可能最简单的排序策略就是: 1.搜索整个列表,找到最小项的位置 2.如果该位置不是列表的第一项,则将两项交换位置 3.然后算法回到第二个位置并重复上述操作 4.当算法到达列表最后一个位置的时候,排序就 ...

  6. [转载] python选择排序二元选择_选择排序:简单选择排序(Simple Selection Sort)

    参考链接: Python中选择排序Selection Sort 基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的 ...

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

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

  8. python八大选择排序_Python实现选择排序

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

  9. python实现选择排序

    python实现选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置:接着,再从剩余 ...

最新文章

  1. mac apache 和 nginx ssl 配置自签名的SSL
  2. mysql:mysql error:Access denied for user 'root'@'localhost' (using password: YES)
  3. CentOS 开机自启动脚本
  4. php开发支持的文件类型整理
  5. mysql group 条件,mysql - mysql group by,两个条件,限制1 - SO中文参考 - www.soinside.com...
  6. Activity的四种启动模式-图文并茂
  7. oracle临时表空间组,证明临时表空间组在并发session时的作用
  8. 升级步骤linux_开发人员福音,在win10系统上安装linux子系统
  9. .net core 常见设计模式-IChangeToken
  10. html textarea粘贴事件,javascript在textarea中捕获粘贴事件
  11. 扬州大学c语言上机作业答案,扬州大学C语言上机作业1-9整理
  12. 评国内三大B2C网站首页的信息架构
  13. 中国微流体系统市场趋势报告、技术动态创新及市场预测
  14. 请回答数据结构【二叉搜索树】
  15. 《重构:改善既有代码的设计》读书笔记(上)
  16. 遍历input。select option 选中的值
  17. Hbuilder x css样式编写无提醒
  18. 查看tomcat的版本号
  19. C语言中的signal函数
  20. 百度服务器保存信息多久,百度快照在百度服务器里保存多长时间???

热门文章

  1. Java代码内容概述
  2. 安卓系统为何这么容易被黑客入侵
  3. Sublime Text 3 设置
  4. LAMP搭建discuz
  5. 深入理解 gRPC 协议--理解protobuf/.proto/http2
  6. 浅谈Eclipse GEF
  7. android 获取芯片版本_谷歌:未来Android手机将获得4年软件更新
  8. 基于FPGA实现UART接口设计(异步串行通信)
  9. (79)FPGA如何处理跨时钟域问题-面试必问(三)(第16天)
  10. html如何实现字体逐个输入,HTML – 如何将字体真棒图标插入文本输入?