Java对数组实现选择排序算法的实例详解

 更新时间:2016年04月14日 08:51:44   作者:匆忙拥挤repeat  
这篇文章主要介绍了Java对数组实现选择排序算法的实例,选择排序的比较次数为 O(N^2)而交换数为O(N),需要的朋友可以参考下

一. 算法描述
    选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
以下面5个无序的数据为例:
56 12 80 91 20(文中仅细化了第一趟的选择过程)
第1趟:12 56 80 91 20

201641485158319.jpg (336×307)

第2趟:12 20 80 91 56
第3趟:12 20 56 91 80
第4趟:12 20 56 80 91
二. 算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1)  (用于交换和记录索引)
稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
三. 算法实现

 
public class SelectionSort { 
  public static void main(String[] args) { 
    int len = 15; 
    int[] ary = new int[len]; 
    Random random = new Random(); 
    for (int j = 0; j < len; j++) { 
      ary[j] = random.nextInt(1000); 
    } 
    System.out.println("-------排序前------"); 
//   ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //测试交换次数 
//   ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //测试交换次数 
    for (int j = 0; j < ary.length; j++) { 
      System.out.print(ary[j] + " "); 
    } 
     
    selectDesc(ary); 
    selectAsc(ary); 
  } 
  /* 
   * 选择排序:降序 
   */ 
  static void selectDesc(int[] ary) { 
    int compareCount = 0;//比较次数 
    int changeCount = 0;//交换次数 
    int len = ary.length; 
    int maxValueIndex = -1; //记录一轮比较下来的最小值索引 
    for (int i = 0; i < len - 1; i++) { 
      maxValueIndex = i; //从0开始 
      for (int j = i + 1; j < len; j++) { 
        if (ary[maxValueIndex] < ary[j]) { 
          maxValueIndex = j; //记录较大的索引 
          compareCount++; 
        } 
      } 
//     System.out.println("minValueIndex==" + maxValueIndex); 
      if (maxValueIndex != i) {//如果跟左边的记录索引不同,则交换 
        ary[i] = ary[maxValueIndex] + (ary[maxValueIndex] = ary[i]) * 0;//一步交换 
        changeCount++; 
      } 
    } 
     
    System.out.println("\n-------降序排序后------比较次数:" + compareCount + ",交换次数" + changeCount); 
    for (int j = 0; j < ary.length; j++) { 
      System.out.print(ary[j] + " "); 
    } 
  } 
   
  /* 
   * 选择排序:升序 
   */ 
  static void selectAsc(int[] ary) { 
    int compareCount = 0, changeCount = 0; 
    int len = ary.length; 
    int minIndex = -1; 
    for (int i = 0; i < len - 1; i++) { 
      minIndex = i; 
      for (int j = i + 1; j < len; j++) { 
        if (ary[minIndex] > ary[j]) { 
          minIndex = j; //记录较小的索引 
          compareCount++; 
        } 
      } 
      if (minIndex != i) {//如果跟左边的记录索引不同,则交换 
        ary[i] = ary[minIndex] + (ary[minIndex] = ary[i]) * 0; 
        changeCount++; 
      } 
    } 
    System.out.println("\n-------升序排序后------比较次数:" + compareCount + ",交换次数" + changeCount); 
    for (int j = 0; j < ary.length; j++) { 
      System.out.print(ary[j] + " "); 
    } 
  } 
} 

打印

-------排序前------ 
125 350 648 789 319 699 855 755 552 489 187 916 596 731 852  
-------降序排序后------比较次数:26,交换次数13 
916 855 852 789 755 731 699 648 596 552 489 350 319 187 125  
-------升序排序后------比较次数:56,交换次数7 
125 187 319 350 489 552 596 648 699 731 755 789 852 855 916  

相关文章

  • 浅谈Java中static和非static的区别

    浅谈Java中static和非static的区别

    这篇文章主要介绍了Java中static和非static的相关内容,小编觉得还是很不错的,这里分享给大家,需要的朋友可以参考下。
    2017-10-10
  • Java多线程之简单模拟售票功能

    Java多线程之简单模拟售票功能

    这篇文章主要介绍了Java多线程之简单模拟售票功能,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-04-04
  • Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

    Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

    本篇文章主要介绍了Spring Boot中使用jdbctemplate 操作MYSQL数据库实例,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • springmvc接口接收参数与请求参数格式的整理

    springmvc接口接收参数与请求参数格式的整理

    这篇文章主要介绍了springmvc接口接收参数与请求参数格式的整理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JFormDesigner(IDEA)下载方法

    JFormDesigner(IDEA)下载方法

    JFormDesigner是一种Java Swing GUI设计工具,可快速创建用户界面,支持多种布局管理器,如GridBagLayout、SpringLayout等,本文给大家介绍JFormDesigner(IDEA)下载方法,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • 使用springboot整合mybatis-plus实现数据库的增删查改示例

    使用springboot整合mybatis-plus实现数据库的增删查改示例

    这篇文章主要介绍了使用springboot整合mybatis-plus实现数据库的增删查改示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Spring中的@ConfigurationProperties在方法上的使用详解

    Spring中的@ConfigurationProperties在方法上的使用详解

    这篇文章主要介绍了Spring中的@ConfigurationProperties在方法上的使用详解,@ConfigurationProperties应该经常被使用到,作用在类上的时候,将该类的属性取值 与配置文件绑定,并生成配置bean对象,放入spring容器中,提供给其他地方使用,需要的朋友可以参考下
    2024-01-01
  • Java中Exception和Error的区别详解

    Java中Exception和Error的区别详解

    这篇文章主要介绍了Java中Exception和Error的区别详解,通过类的关系分析两者的区别与应用场景,包含代码实例,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • vue2向springboot传值接收不到的解决方法

    vue2向springboot传值接收不到的解决方法

    本文主要介绍了vue2向springboot传值接收不到的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 分布式系统中的降级熔断设计问题面试

    分布式系统中的降级熔断设计问题面试

    这篇文章主要为大家介绍了分布式系统中的降级熔断设计问题面试解答,有需要的朋友可以借鉴参考下,希望能有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论