选择排序:

原理:依次从数组最左边取一个元素,与之后的位置上的元素比較,假设大于/小于(取决于须要升序排还是降序排)。则保存较大/较小元素的索引

当一轮比較后,将保存的较大/较小元素的索引与 这轮開始比較的左边元素置换

改进了冒泡排序,交换次数从O(N^2)降低到O(N), 而比較次数还是O(N^2) 。实际上交换次数最大就等于N-1次

  1. /**
  2. * 选择排序
  3. * 比較次数 O(N^2), 交换O(N)
  4. * @author stone
  5. *
  6. */
  7. public class SelectionSort {
  8. public static void main(String[] args) {
  9. int len = 15;
  10. int[] ary = new int[len];
  11. Random random = new Random();
  12. for (int j = 0; j < len; j++) {
  13. ary[j] = random.nextInt(1000);
  14. }
  15. System.out.println("-------排序前------");
  16. // ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //測试交换次数
  17. // ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //測试交换次数
  18. for (int j = 0; j < ary.length; j++) {
  19. System.out.print(ary[j] + " ");
  20. }
  21.  
  22. selectDesc(ary);
  23. selectAsc(ary);
  24. }
  25. /*
  26. * 选择排序:降序
  27. */
  28. static void selectDesc(int[] ary) {
  29. int compareCount = 0;//比較次数
  30. int changeCount = 0;//交换次数
  31. int len = ary.length;
  32. int maxValueIndex = -1; //记录一轮比較下来的最小值索引
  33. for (int i = 0; i < len - 1; i++) {
  34. maxValueIndex = i; //从0開始
  35. for (int j = i + 1; j < len; j++) {
  36. if (ary[maxValueIndex] < ary[j]) {
  37. maxValueIndex = j; //记录较大的索引
  38. compareCount++;
  39. }
  40. }
  41. // System.out.println("minValueIndex==" + maxValueIndex);
  42. if (maxValueIndex != i) {//假设跟左边的记录索引不同,则交换
  43. ary[i] = ary[maxValueIndex] + (ary[maxValueIndex] = ary[i]) * 0;//一步交换
  44. changeCount++;
  45. }
  46. }
  47.  
  48. System.out.println("\n-------降序排序后------比較次数:" + compareCount + "。交换次数" + changeCount);
  49. for (int j = 0; j < ary.length; j++) {
  50. System.out.print(ary[j] + " ");
  51. }
  52. }
  53.  
  54. /*
  55. * 选择排序:升序
  56. */
  57. static void selectAsc(int[] ary) {
  58. int compareCount = 0, changeCount = 0;
  59. int len = ary.length;
  60. int minIndex = -1;
  61. for (int i = 0; i < len - 1; i++) {
  62. minIndex = i;
  63. for (int j = i + 1; j < len; j++) {
  64. if (ary[minIndex] > ary[j]) {
  65. minIndex = j; //记录较小的索引
  66. compareCount++;
  67. }
  68. }
  69. if (minIndex != i) {//假设跟左边的记录索引不同。则交换
  70. ary[i] = ary[minIndex] + (ary[minIndex] = ary[i]) * 0;
  71. changeCount++;
  72. }
  73. }
  74. System.out.println("\n-------升序排序后------比較次数:" + compareCount + ",交换次数" + changeCount);
  75. for (int j = 0; j < ary.length; j++) {
  76. System.out.print(ary[j] + " ");
  77. }
  78. }
  79. }

打印

  1. -------排序前------
  2. 125 350 648 789 319 699 855 755 552 489 187 916 596 731 852
  3. -------降序排序后------比較次数:26,交换次数13
  4. 916 855 852 789 755 731 699 648 596 552 489 350 319 187 125
  5. -------升序排序后------比較次数:56。交换次数7
  6. 125 187 319 350 489 552 596 648 699 731 755 789 852 855 916

Java 实现选择排序的更多相关文章

  1. Java实现选择排序

    选择排序思想就是选出最小或最大的数与第一个数交换,然后在剩下的数列中重复完成该动作. package Sort; import java.util.Arrays; public class Selec ...

  2. [Java]数组排序-选择排序 冒泡排序 插入排序

    1 选择排序  原理:a 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.       b 每轮使用a的规则, 可以选择出 ...

  3. 过三关 Java冒泡排序选择排序插入排序小练习

    材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...

  4. Java中选择排序,冒泡排序,插入排序,快速排序

    一:冒泡法排序  //冒泡排序 注:从小到大排   //特点:效率低,实现简单  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...

  5. Java使用选择排序法对数组排序

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

  6. java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数

    import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...

  7. JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  8. JAVA数据结构--选择排序

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

  9. JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    一直到大四才开始写自己的第一篇博客,说来实在有点羞愧.今天写了关于排序的算法题,有插入排序,冒泡排序,选择排序,以下贴上用JAVA实现的代码: public class test5 { public ...

  10. java:选择排序法对数组排序

    最近想练一练Java的算法,然后碰到LeetCode上一道从排序数组删除重复项的小题,刚开始没看到是从排序数组中,就乱写,其实要是排序树组,就比乱序的感觉上好写多了.然后就想回顾下冒泡法对数组排序,凭 ...

随机推荐

  1. Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法

    最近在做真机测试的时候,经常出现Installation error: INSTAL L_FAILED_INSUFFICIENT_STORAGE这个问题,导致apk没法安装到是手机上,在eclipse ...

  2. 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置

    Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作.在hadoop1时代,只有一个NameNode.如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了.这是 ...

  3. AngularJS 初始化加载流程

    一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...

  4. 如何保证RabbitMQ的消息不丢失及其背后的原理

    一.消息为什么丢失 RabbitMQ默认情况下的交换机和队列以及消息是非持久化的,也就是说在服务器重启或者宕机恢复后,之前创建的交换机和队列都将不复存在,之前未消费的消息也就消失不见了.原因在于每个队 ...

  5. arm B和BL指令浅析

    arm B和BL指令浅析 B或BL指令引起处理器转移到“子程序名”处开始执行.两者的不同之处在于:(1)BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器).      ...

  6. XPath学习:轴(1)——child

    http://www.cnblogs.com/zhaozhan/archive/2009/09/10/1563723.html ************************************ ...

  7. FileZilla server windows 2003系统下适用的版本

    最新版的FileZilla server 在windows 2003系统下已经不能用了 http://files.cnblogs.com/files/airoot/FileZilla_Server-0 ...

  8. 国际化的工具类ognl utils

    package yycg.util; import java.io.Serializable;import java.text.MessageFormat;import java.util.Array ...

  9. grub安装centos

    grub安装centos http://hi.baidu.com/soulshape/item/e90302e50da5a710595dd8f7

  10. js获取checkbox值的方法

    js获取checkbox值的方法.分享给大家供大家参考.具体实现方法如下:<html> <head> <meta http-equiv="Content-Typ ...