选择排序超详细讲解C语言
文章目录
- 算法步骤
- 动图演示
- 静图演示
- 代码实现
- 普通
- 升级
- 复杂度、稳定性分析
选择排序是一种简单直观的排序算法,无论数据是否有序,该排序的时间复杂度恒为 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--;}
}
复杂度、稳定性分析
时间复杂度
假设有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)。
空间复杂度
仅仅使用了常数个辅助单元,空间复杂度是O(1);
稳定性
举个例子,序列6 8 6 2 7, 第一遍选择,第一个6会和2交换,那么原序列中2个6的相对前后顺序就被破坏了,
所以是不稳定的。
选择排序超详细讲解C语言相关推荐
- 超详细讲解C语言入门函数(一)
解析已经很详细了,可以说相当入门级别了,如果喜欢的话那就请支持一下,后续会继续更新~ 代码网上搜索,并加以更改,侵权请联系删除,谢谢~ 部分例子没有详细解释是因为前面的例子已经说过了 3×4矩阵求最大 ...
- 插入排序超详细讲解C语言
文章目录 算法步骤 动图演示 静图演示 代码实现 复杂度.稳定性分析 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤 将第一待排序序列 ...
- stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)
stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...
- Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】
Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- Python的零基础超详细讲解(第五天)-Python的运算符
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...
- mybatis-plus超详细讲解
(6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...
- 超详细分解c 语言——实现扫雷游戏(详解)
之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...
最新文章
- 撑起整个互联网的7大开源技术
- VoIP安全问题解析
- java synchronized wait
- 无参数泛型方法反模式
- 特性Attribute
- java json path_Java使用JSONPath解析JSON完整内容详解
- List of Javascript Library / Ajax Framework / Web Application Framework
- ps aux 查看进程信息
- 高程拟合MATLAB二次曲面,GPS高程二次曲面拟合及其程序
- Debian Qualcomm Atheros QCA61x4 Wireless Network Adapter - 网卡驱动
- Python 贪吃蛇小游戏
- win10分屏快捷键无法使用_Win10系统Win快捷键不能用怎么办_win10 Win快捷键无法使用如何解决-系统城...
- matlab新手入门的简单操作
- arcgis批量裁剪影像tif流程_【ArcGIS自定义脚本工具】批量裁剪中国多省份NDVI影像...
- Cisco系列交换机型号
- 来自2018年最后的瞎扯——从“空间”到“强人工智能”
- 链游界王炸巨作 一个足够炫酷的NFT赛犬游戏震撼问世
- 中央电大c 语言程序设计本科试题,中央电大本科C语言程序设计A试题2010年7月.doc...
- LANDESK桌面管理软件
- 20191009 3. 史上最全的USB-PD充电协议,包含PD协议波形图
热门文章
- 拳头服务器在修复,拳头终于要修复客户端了:在接下来的六个月内,清理客户端...
- Hessian 序列化、反序列化
- 37:WEB漏洞-反序列化之PHPJAVA全解(上)
- 问题-不在以下 request 合法域名列表中,请参考文档
- hackbar 的简单使用
- oracle同义词truncate,oracle同义词
- redhat6+dm7数据库单机安装步骤
- [书蕴笔记-0]文本预处理
- 阿里大股东Altaba准备清算解散 所持阿里股份也计划全部出售
- 如何发送入职通知语音信息?入职语音通知实现方案