一、选择排序法思路:先将最小(大)的元素取出,再在剩下的元素,再将其中最小(大)的取出,每次选择未处理的元素中最小(大)的元素,进行排序。

    1、两种思路:

①开辟一个新的数组空间,将比较出来的最小(大)元素依次放入新数组中进行排序

②进行原地排序,在源数组中进行元素的交换。

二、算法的实现

1、开辟空间排序算法实现:

    /*** 开辟空间异地排序* 对一个数组的元素进行排序(从小到大输出),选择排序*/public static void sortArray2(int[] array){/*newArray//作为存放新排序后的数组的元素。*/int[] newArray=new int[array.length];//定义一个新数组(新空间)for (int i=0;i<array.length;i++){int minIndex=i;for (int j=i;j<array.length;j++){if (array[j]<array[minIndex]){minIndex=j;}newArray[i]=array[minIndex];}array[minIndex]=array[i];//不能重复让最小的元素进行循环,应该将其覆盖掉。}System.out.println(Arrays.toString(newArray));}

如此排序思路简单,但是造成了空间上的浪费,于是我们需要优化选择排序。

2、原地排序思路如下图:

解析:将i索引定为循环开始,i为外层循环,循环开始后,将最小值索引设置为minIndex,并且暂定为索引i的元素,然后从j开始往后检索,此时j=i,若j索引位置的元素小于minIndex索引位置的元素,则将最小值索引minIndex替换为当前的j;当内层循环走过一遍后,即可得到整个数组(因为此时是第一遍循环)的最小值,每次循环都可在[i,array.length)范围内找到其中的最小值。然后将得到的最小值便可将其与当前外层循环的i元素进行交换,如此即可完成原地排序。

    注意事项:元素交换的常用模式:定义一个swap作为中间变量进行交换。

3、算法实现:

 /*** 原地排序* 对一个数组的元素进行排序(从小到大输出),选择排序*/public static void sortArray1(int[] array) {/*int i = array[0];//取出第一个元素,逐个与数组中其他元素进行比较,大于则替换,否则不变。int j;//记录所需要进行比较扫描的数组元素索引,对arr[j,arr.length-1]进行扫描。int minIndex = 0;//记录比较后,替换的元素的索引int swap=0;作为交换中间变量(固定模式)*/for (int i = 0; i < array.length; i++) {int minIndex=i;for (int j=i;j<array.length;j++){if (array[j]<array[minIndex]){minIndex=j;}}//进行交换int swap=array[i];array[i]=array[minIndex];array[minIndex]=swap;}for (int k=0;k<array.length;k++){System.out.println(array[k]);}}

 4、作为一个方法,应当符合方法的复用性,所以这里应当将方法泛型化,如下

/*** 优化选择排序原地排序,让算法的复用性提高----即泛型化。* 泛型方法:在修饰符后面加<E>,extends Comparable的作用是限制参数为可比较的(只接收继承类及其子类的类型)。*         ** 若为super,则参数只接收该类及其父类。*/public static <E extends Comparable<E>> void selectSort(E[] array){for (int i=0;i<array.length;i++){int minIndex=i;for (int j=i;j<array.length;j++){if (array[j].compareTo(array[minIndex])<0){//comparableTo方法相当于减法顺序,结果大于零则前者大于后者;//反之则小于,两者相等则等于零。minIndex=j;}//交换元素位置,实现排序E swap=array[i];array[i]=array[minIndex];array[minIndex]=swap;}}System.out.println(Arrays.toString(array));}

以上方法,对于测试时,数组应当为可比较的数据类型,而且不能为基本数据类型,应为其包装类。应为泛型不能是基本数据类型。

三、对算法复杂度浅析

由以上的算法实现可以看出:其实程序的进行,被检索的元素是逐渐减少的,类似

1+2+3+4+...+n的等差数列,于是,我们可以列出其复杂度的公式:1/2n^2+1/2n。又因为在算法复杂度分析中,常数级别的复杂度可以忽略,即n平方前的系数二分之一,然后n比n方低阶,当数据达到一定规模时,也是忽略的,所以该算法的复杂度为O(n^2)。

基础排序算法之选择排序法相关推荐

  1. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  2. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  3. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  4. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

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

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

  6. 排序算法(3)选择排序

    排序算法(3)选择排序 原理:思想:两个变种(1)单侧选择:在一个无序数组中选择出每一轮中最大值(或最小值)元素,放到最前面或最后面(升序)(2)双向选择:在一个无序数组中选择出每一轮中最值元素,然后 ...

  7. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  8. 【排序算法】选择排序(C语言)

    [排序算法]-- 选择排序 目录 一.选择排序的原理 二.选择排序的代码实现 三.选择排序的优化 1. 优化思路 2. 排序优化后问题 3. 优化代码的实现 四.选择排序的效率 一.选择排序的原理 ​ ...

  9. java中的排序算法——简单选择排序,树形选择排序与堆排序(一)

    package com.sort; /**  * 选择排序:  * 简单选择排序,树形选择排序与堆排序  *   */ public class SelecSortDemo { /** * ----- ...

  10. 选择排序算法流程图_常用排序算法之选择排序

    前两天给大家分享了冒泡排序和插入排序(没关注的同学,可以关注后查看历史消息),今天继续给大家分享另一种常用的排序算法--选择排序. 选择排序 选择排序和插入排序很相似,也区分已排序区间和未排序区间,选 ...

最新文章

  1. 使用libjpeg显示JPEG图像在framebuffer 测试(八)
  2. 4:springApplication.run 原理
  3. 指定特定的内容为首页
  4. 大学生如何成功就业。
  5. 查找空目录Linux,Linux中find批量删除空文件及空文件夹脚本
  6. html5制作线路图,HTML5画电路图
  7. AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher
  8. Python基础篇1
  9. 索尼电视测试软件,索尼智能电视检测漏光、坏点等现象的简单小教程
  10. 计算机电源(atx电源),电脑ATX电源各级电压标准
  11. 想做产品经理,产品经理培训靠谱吗?
  12. i春秋 - Exploit-Exercises: Nebula - level03
  13. opengGL实战——太阳系三维场景动画搭建
  14. 学生课程注册管理系统
  15. k8s高可用多节点master搭建
  16. 微博--图片,视频,评论抓取
  17. 想知道手机视频压缩app哪个好用?这几个工具值得一试
  18. 利用Vlan实现家庭网络单线复用
  19. MySQL专题四——MySQL函数(聚合函数)
  20. 解决GitHub无法登录的方法

热门文章

  1. 高级控件AdapterView(一):Adapte继承体系及BaseAdapter
  2. 【原创】超牛的用户界面动态切换特效资源与实例
  3. sftp之概述、搭建、命令
  4. android textview 绝对位置,android – 在运行时在RemoteView中设置TextView的位置
  5. linux共享文件夹密码,[Linux]ubuntu下共享文件夹密码设置和重置-smbpasswd -a user
  6. 有刷电机的速度pid-位置pid算法
  7. Java架构师岗位的基本职责
  8. 【Tritium早报】2021.6.22|中国工商银行、中国农业银行、中国建设银行、中国邮政储蓄银行、兴业银行、支付宝等随后陆续发布公告
  9. 2023年信息与通信工程国际会议(JCICE 2023)
  10. html5+php视频播放器,一个好用的html视频播放器兼容主流浏览器