选择排序算法的实现思路类似于插入排序,即已排序区间+未排序区间

1.算法定义

选择排序是基于选择的排序,即每次需要选择元素进行排序

2.算法思想

(1)第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置

(2)然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

(3)以此类推,直到全部待排序的数据元素的个数为零

来看看,选择排序原理示意图

3.代码实现

(1)首先来看一下,找最小元素的选择排序实现

有序区间+无序区间

关于有序区间和无序区间的边界问题,可以画个图自己分析一下(这块很不容易理解哦,建议画图)

    //将未排序区间的最小值放到以排序区间的末尾public static void selectSort(int[] array){int n = array.length;if(n <= 1){return;}else{//有序区间:[0,i)无序区间:[i,n)for(int i = 0;i < n-1;i++){int minValueIndex = i;//j = [有序区间后一个元素,无序区间的最后一个元素]for(int j = i+1;j < n;j++){if(array[j] < array[minValueIndex]) {minValueIndex = j;}}//交换int temp = array[i];array[i] = array[minValueIndex];array[minValueIndex] = temp;}}}

那看看我的图吧:i是从0开始遍历的,那么在刚开始时,有序区间为[0,i],那么无序区间就是[i,n).哈哈哈,其实理解起来也还好

(2)接下来,这个我可是看了好久,每次找最大元素放到最后

无序区间+有序区间

刚开始,i = 0,整个数组数据都为无序区间里的元素,所以呢,无序区间为[0,n-i),有序区间为[n-i,n)

    //每次取最大值放到无序区间的最后public static void selectSort0(int[] array){int n = array.length;if (n <= 1){return;}else{for(int i = 0;i < n-1;i++){//无序区间:[0,n-i)有序区间:[n-i,n)int j = 1;//j = [无序区间的第二个元素,有序区间的前一个元素]int maxValueIndex = 0;for(;j < n-i;j++){if(array[j] > array[maxValueIndex]){maxValueIndex = j;}}//交换int temp = array[n-i-1];array[n-i-1] = array[maxValueIndex];array[maxValueIndex] = temp;}}}

4.看个栗子

来测试一个数组a={2,5,1,7,3,6,9}

    public static void main(String[] args) {int[] a = {2,5,1,7,3,6,9};//有序区间+无序区间int[] b = a.clone();selectSort(b);System.out.println(Arrays.toString(b));//无序区间+有序区间int[] c = a.clone();selectSort0(c);System.out.println(Arrays.toString(c));//通过Arrays.sort进行验证排序结果int[] d = a.clone();Arrays.sort(d);System.out.println(Arrays.toString(d));System.out.println(Arrays.equals(b,d));System.out.println(Arrays.equals(c,d));}

测试结果:

下面,按照国际惯例,嗯嗯,就是测一下100000个数据元素的排序速度,

比起希尔排序,插入排序会慢一点,不过没关系,他也有他特殊的使用场景

测试时间代码在这里呀

    public static void testSpeed(){Random random = new Random(20191019);int[] a = new int[100000];int[] b = a.clone();for (int i = 0;i < 100000;i++){a[i] = random.nextInt(200000);}long begin = System.nanoTime();selectSort(a);long end = System.nanoTime();double s = (end-begin)/1000/1000/1000;System.out.printf("selectSort:一共耗时:%.5f 秒%n",s);long begin0 = System.nanoTime();selectSort0(a);long end0 = System.nanoTime();double s0 = (end-begin)/1000/1000/1000;System.out.printf("selectSort0:一共耗时:%.5f 秒%n",s);}

5.算法分析(复杂度、稳定性)

1.复杂度分析

时间复杂度:(两个循环)

最好情况:O(n^2)

最坏情况:O(n^2)

平均情况:O(n^2)

空间复杂度:O(1)(因为没有开辟新空间)-原地排序算法

2.稳定性分析

不稳定的排序算法

比如5,8,5,2,9这样一组数组,使用选择排序算法来看,两个5原来的顺序在排序结束后被改变了,所以选择排序算法是不稳定的。

6.源程序

package sort.selectSort;import java.util.Arrays;
import java.util.Random;/*** @Author:Star* @Date:Created in 11:05 2019/10/19* @Description:选择排序* 时间复杂度:* 空间复杂度:* 稳定性:*/
public class Sort {//将未排序区间的最小值放到以排序区间的末尾public static void selectSort(int[] array){int n = array.length;if(n <= 1){return;}else{//有序区间:[0,i)无序区间:[i,n)for(int i = 0;i < n-1;i++){int minValueIndex = i;//j = [有序区间后一个元素,无序区间的最后一个元素]for(int j = i+1;j < n;j++){if(array[j] < array[minValueIndex]) {minValueIndex = j;}}//交换int temp = array[i];array[i] = array[minValueIndex];array[minValueIndex] = temp;}}}//每次取最大值放到无序区间的最后public static void selectSort0(int[] array){int n = array.length;if (n <= 1){return;}else{for(int i = 0;i < n-1;i++){//无序区间:[0,n-i)有序区间:[n-i,n]int j = 1;//j = [无序区间的第二个元素,有序区间的前一个元素]int maxValueIndex = 0;for(;j < n-i;j++){if(array[j] > array[maxValueIndex]){maxValueIndex = j;}}//交换int temp = array[n-i-1];array[n-i-1] = array[maxValueIndex];array[maxValueIndex] = temp;}}}public static void testSpeed(){Random random = new Random(20191019);int[] a = new int[100000];int[] b = a.clone();for (int i = 0;i < 100000;i++){a[i] = random.nextInt(200000);}long begin = System.nanoTime();selectSort(a);long end = System.nanoTime();double s = (end-begin)/1000/1000/1000;System.out.printf("selectSort:一共耗时:%.5f 秒%n",s);long begin0 = System.nanoTime();selectSort0(a);long end0 = System.nanoTime();double s0 = (end-begin)/1000/1000/1000;System.out.printf("selectSort0:一共耗时:%.5f 秒%n",s);}public static void main(String[] args) {/*int[] a = {2,5,1,7,3,6,9};//有序区间+无序区间int[] b = a.clone();selectSort(b);System.out.println(Arrays.toString(b));//无序区间+有序区间int[] c = a.clone();selectSort0(c);System.out.println(Arrays.toString(c));//通过Arrays.sort进行验证排序结果int[] d = a.clone();Arrays.sort(d);System.out.println(Arrays.toString(d));System.out.println(Arrays.equals(b,d));System.out.println(Arrays.equals(c,d));*/testSpeed();}
}

期待留言和分享哦

一起学习,一起进步(笑脸~~~)

挑战七大排序算法-03选择排序相关推荐

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

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

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

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

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

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

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

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

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

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

  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. 选择排序算法流程图_常用排序算法之选择排序

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

  10. 排序算法之选择排序(简单选择排序、堆排序)

    选择排序(简单选择排序.堆排序) 选择排序 简单选择排序 概念 算法实现 堆排序 概念 算法实现 后续 选择排序 选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列 ...

最新文章

  1. Chapter 4 Invitations——4
  2. LogisticRegression_demo
  3. 蓝桥杯C++ AB组辅导课 第一讲 递归与递推 Acwing
  4. webapi 获取请求参数
  5. xhprof在windows下面的安装和使用[上](windows版本)
  6. 实验四 linux进程控制实验报告,Linux系统进程控制操作系统实验报告4
  7. python des加密文件_python基于pyDes库实现des加密的方法
  8. Atitit.java 虚拟机的构成 与指令分类 与 指令集合 以及字节码查看工具javjap
  9. matlab遗传算法输出参数太多,用遗传算法工具箱时错误提示太多输出参数?
  10. 《穿越计算机的迷雾》读书笔记八
  11. 基础SQL第二课:约束
  12. 常见的数据结构与算法
  13. 利用CSS制作一个梦幻西游小动画
  14. 算法分析:大O符号/大Ω符号/大Θ符号/小o符号/小w符号
  15. [TCP灵魂之问]介绍一下 TCP 报文头部的字段
  16. 表单验证-通用表单验证大全/通用表单验证函数收集
  17. 从新版电视剧《笑傲江湖》看到的颠覆思维
  18. 【无人机】PIXHAWK、PX4、APM区别
  19. 前端Vue+ElementUI的Pagination分页组件实现分页展示 后端Spring Boot +Mybatis Plus实现分页接口
  20. 雅马哈机器人编程讲解_YAMAHA 机器人3D模拟仿真讲解

热门文章

  1. 阿里云cdn设置不缓存
  2. 《预训练周刊》第53期:代码生成、通用任务变换器
  3. kibana的安装(elasticsearch图形化界面)
  4. grafana mysql 变量_grafana之Variables变量的使用
  5. ZOJ - 3939
  6. DescendingOrder
  7. 史上最全的Windows进程详解!
  8. cents7.6安装rancher
  9. Ubuntu20.04设置网络共享文件夹
  10. 在线培训-虚拟演播室嵌入网页直播