文章目录

  • 算法步骤
  • 动图演示
  • 静图演示
  • 代码实现
    • 普通
    • 升级
  • 复杂度、稳定性分析

选择排序是一种简单直观的排序算法,无论数据是否有序,该排序的时间复杂度恒为 O(N2)O(N^{2})O(N2),所以用该排序时,数据量越小越好。

算法步骤

首先在未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,然后再从剩下的未排序序列中找到最小的(升序)元素,放在未排序序列的起始位置,以此类推。

动图演示

静图演示

代码实现

普通

void SelectSort(int* a, int n){for(int i = 0; i < n - 1; i++){//在未排序序列中找最小的元素int minIndex = i;for(int j = i + 1; j < n; j++){if(a[minIndex] > a[j]){minIndex = j;//minIndex始终是最小元素的下标}}Swap(&a[minIndex], &a[i]);//将最小元素和首元素交换}
}

升级

上面的是每次循环只找一个最小的,将最小的放首位后,序列向右收缩;

而现在的升级版本是每次循环找一个最小的和一个最大的,将最小的放首位,最大的放末位,序列向中间收缩。

然后

void SelectSort(int* a, int n){int left = 0;int right = n - 1;while(left < right){int minIndex = left;int maxIndex = left;for(int i = left + 1; i <= right; i++){if(a[minIndex] > a[i]){minIndex = i;}if(a[maxIndex < a[i]]){maxIndex = i;}}Swap(&a[minIndex], &a[left]);if(maxIndex == left){maxIndex = minIndex;}Swap(&a[maxIndex], &a[right]);left++;right--;}
}

复杂度、稳定性分析

  1. 时间复杂度

    假设有N个数据

    不论数据是否有序,在排第1个数据时必定会比较N-1次,排第2个数据时必定会比较N-2次,所以总的比较次数为1+2+3+...+(N−1)1 + 2 + 3+...+(N-1)1+2+3+...+(N−1),等差数列求和,结果为N2/2N^{2}/2N2/2,时间复杂度为O(N2)O(N^{2})O(N2)

  2. 空间复杂度

    仅仅使用了常数个辅助单元,空间复杂度是O(1);

  3. 稳定性

    举个例子,序列6 8 6 2 7, 第一遍选择,第一个6会和2交换,那么原序列中2个6的相对前后顺序就被破坏了,

    所以是不稳定的

选择排序超详细讲解C语言相关推荐

  1. 超详细讲解C语言入门函数(一)

    解析已经很详细了,可以说相当入门级别了,如果喜欢的话那就请支持一下,后续会继续更新~ 代码网上搜索,并加以更改,侵权请联系删除,谢谢~ 部分例子没有详细解释是因为前面的例子已经说过了 3×4矩阵求最大 ...

  2. 插入排序超详细讲解C语言

    文章目录 算法步骤 动图演示 静图演示 代码实现 复杂度.稳定性分析 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤 将第一待排序序列 ...

  3. stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)

    stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...

  4. Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】

    Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...

  5. Python的零基础超详细讲解(第七天)-Python的数据的应用

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  6. Python的零基础超详细讲解(第五天)-Python的运算符

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  7. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  8. mybatis-plus超详细讲解

    (6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...

  9. 超详细分解c 语言——实现扫雷游戏(详解)

    之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...

最新文章

  1. 撑起整个互联网的7大开源技术
  2. VoIP安全问题解析
  3. java synchronized wait
  4. 无参数泛型方法反模式
  5. 特性Attribute
  6. java json path_Java使用JSONPath解析JSON完整内容详解
  7. List of Javascript Library / Ajax Framework / Web Application Framework
  8. ps aux 查看进程信息
  9. 高程拟合MATLAB二次曲面,GPS高程二次曲面拟合及其程序
  10. Debian Qualcomm Atheros QCA61x4 Wireless Network Adapter - 网卡驱动
  11. Python 贪吃蛇小游戏
  12. win10分屏快捷键无法使用_Win10系统Win快捷键不能用怎么办_win10 Win快捷键无法使用如何解决-系统城...
  13. matlab新手入门的简单操作
  14. arcgis批量裁剪影像tif流程_【ArcGIS自定义脚本工具】批量裁剪中国多省份NDVI影像...
  15. Cisco系列交换机型号
  16. 来自2018年最后的瞎扯——从“空间”到“强人工智能”
  17. 链游界王炸巨作 一个足够炫酷的NFT赛犬游戏震撼问世
  18. 中央电大c 语言程序设计本科试题,中央电大本科C语言程序设计A试题2010年7月.doc...
  19. LANDESK桌面管理软件
  20. 20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图

热门文章

  1. 拳头服务器在修复,拳头终于要修复客户端了:在接下来的六个月内,清理客户端...
  2. Hessian 序列化、反序列化
  3. 37:WEB漏洞-反序列化之PHPJAVA全解(上)
  4. 问题-不在以下 request 合法域名列表中,请参考文档
  5. hackbar 的简单使用
  6. oracle同义词truncate,oracle同义词
  7. redhat6+dm7数据库单机安装步骤
  8. [书蕴笔记-0]文本预处理
  9. 阿里大股东Altaba准备清算解散 所持阿里股份也计划全部出售
  10. 如何发送入职通知语音信息?入职语音通知实现方案