选择排序

  • 简介
  • 代码示例
  • 排序过程
  • 时间复杂度
    • 最差时间复杂度&平均时间复杂度
    • 最优时间复杂度
  • 空间复杂度
  • 稳定性

简介

选择排序(Selection Sort),它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

文章中使用的动画网站地址,限 pc: 排序算法动画
http://www.donghuasuanfa.com/sort

代码示例

public static void selectSort(int [] arr,int n){for (int i = 0; i < n - 1; i++) {int index = i;int j;// 找出最小值得元素下标for (j = i + 1; j < n; j++) {if (arr[j] < arr[index]) {index = j;}}int tmp = arr[index];arr[index] = arr[i];arr[i] = tmp;System.out.println(Arrays.toString(arr));}
}

排序过程

时间复杂度

最差时间复杂度 平均时间复杂度 最优时间复杂度
O ( N 2 ) O(N^2) O(N2) O ( N 2 ) O(N^2) O(N2) O ( N ) O(N) O(N)

最差时间复杂度&平均时间复杂度

每轮比较的过程是选择一个元素,然后和未排序数组进行逐个比较,寻找最小值,此过程的时间复杂度为N。每轮比较后找出最小的一个元素。
然后共比较N轮。所以时间复杂度近似为: O ( N 2 ) O(N^2) O(N2)

最优时间复杂度

算法优化。当外层循环时,判断相邻元素的大小,如果元素大小顺序为已排序顺序,一次循环后可结束排序方法。此时的时间复杂度为 O ( N ) O(N) O(N)

代码示例

public static void selectSort(int [] arr,int n){for (int i = 0; i < n - 1; i++) {boolean alreadySort = true;int index = i;int j;// 找出最小值得元素下标for (j = i + 1; j < n; j++) {if (arr[j] < arr[index]) {index = j;alreadySort = false;}if(arr[j-1]> arr[j] ){alreadySort = false ;}}//当前数组没有进行位置,说明为已经排序数组,则结束此循环。if (alreadySort){break;System.out.println(Arrays.toString(arr));}int tmp = arr[index];arr[index] = arr[i];arr[i] = tmp;System.out.println(Arrays.toString(arr));}
}

说明:首先设置已排序数组变量 alreadySort =true。第二层循环内部加判断逻辑,相邻元素进行比较,如果大小位置顺序不正确,则将 alreadySort设置为false。 然后第一层循环内逻辑判断数组是否已排序,如果已排序,则直接结束排序方法。所以时间复杂度为 O(N)。

动画示例

空间复杂度

**空间复杂度: O(1) **

选择排序为交换排序,当两个元素大小不相同时,俩个元素交换位置,无需额外空间,所以空间复杂度为 O(1)。

稳定性

不稳定排序

两个元素的值相同时如果最终排序完成后位置不变,则为稳定排序,如果位置变更则为不稳定排序。
排序算法中,如果数字相同,则无需变更位置,避免额外的操作。

选择排序如果当前锁定元素比后面一个元素大,而后面较小的那个元素又出现在一个与当前锁定元素相等的元素后面,那么交换后位置顺序将会改变。
例:3,7,3,2。第一趟3和2交换位置,那么原序列中的俩个3的位置则互换。所以为不稳定排序。

算法——排序——选择排序图解动画相关推荐

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

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

  2. 数据结构与算法:选择排序

    数据结构与算法:选择排序 雪柯 大工生物信息 提笔为写给奋进之人 已关注 8 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国忠 特别备注:本书非原创,但部分内容自己 ...

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

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

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

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

  5. 数据结构与算法之选择排序

    数据结构与算法之选择排序 目录 基本介绍 选择排序思想 代码实现 1. 基本介绍 选择排序也属于内部排序法,是从排序的数据中,按指定的规则选出某一元素,再依次交换位置后达到排序的目的 2. 选择排序思 ...

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

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

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

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

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

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

  9. C++算法之选择排序

    C++算法之选择排序 文章目录 C++算法之选择排序 一.选择排序 二.题目 1.明明的随机数 2.代码 三.复杂度分析 一.选择排序 选择排序(Selection Sort)是我们学习的第一个排序算 ...

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

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

最新文章

  1. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
  2. XGBoost的GPU用法
  3. 房贷断供会有什么严重后果?
  4. ORACLE 一些时间查询方式
  5. .net 中应用 ValidationAttribute
  6. 解决OpenCV JavaCameraView相机preview方向问题
  7. 【树形dp】VK Cup 2012 Round 1 D. Distance in Tree
  8. 网站域名过户查询_聚查教你怎么用域名批量查询工具查询网站历史和域名权重...
  9. vscode 开发maven项目(springboot项目)
  10. HTML-W3school首页制作
  11. Pycharm修改镜像源并添加信任
  12. CleanMyMac X的免费版电脑系统瘦身工具
  13. WebGis——Pixi开发vue项目之创建pixi应用并显示一个精灵(一)
  14. Android多媒体框架(二)Codec初始化及Omx组件创建
  15. java 数组的行数和列数
  16. CSS 图文左右布局
  17. VMware一些使用心得
  18. TTP233H-BA6功能介绍于适用场景;
  19. mysql 外键约束失败_mysql外键创建失败原因
  20. OpenGL 图像白平衡色温

热门文章

  1. Windows下的远程命令行工具pstools
  2. 周鸿袆教你打造十页完美商业计划书的十条法则
  3. djangoday18
  4. Python 介绍和环境准备
  5. 为什么用样本方差估计总体方差的统计量除以n-1
  6. 留学生VS应届生,留学生在当下还有求职优势吗
  7. cron表达式解析 + robfig/cron 源码剖析
  8. phpstudy搭建upload-labs
  9. 聊天室c语言程序,socket 多线程聊天室的实现(C语言)
  10. java全栈系列之JavaSE--冒泡排序028