【排序算法】选择排序(C语言)
【排序算法】—— 选择排序
目录
- 一、选择排序的原理
- 二、选择排序的代码实现
- 三、选择排序的优化
- 1. 优化思路
- 2. 排序优化后问题
- 3. 优化代码的实现
- 四、选择排序的效率
一、选择排序的原理
选择排序算法是通过遍历数组,选择出数组的最小或最大值,与指定位置交换数据,遍历完整个数组的所有位置就完成排序
- 遍历第一趟数组,找出数组的最小值,与第一个数据交换
- 遍历第二趟数组,继续找出最小值,与第二个数据交换
- 重复上述动作,遍历完数组就得到一个有序数组
二、选择排序的代码实现
//交换两个数据
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//选择排序
void SelectSort(int* arr, int size)
{int i = 0;for (i = 0; i < size-1; i++){int min = i;int j = 0;for (j = i+1; j < size; j++){if (arr[j] < arr[min]){min = j;}}Swap(&arr[i], &arr[min]);}
}
三、选择排序的优化
1. 优化思路
以上算法是每次找出最小的放在指定位置,一共要找n-1
次,如果我们每次不但找到最小的,还找到最大的,将最小的与左端交换,最大的与右端交换,那么就少了一半的遍历次数,从而提高效率
- 变量
begin
和变量end
是数组的两端,min
和max
分别找小和大的下标
- 先交换
min
与begin
位置的数值,再交换max
与end
位置的数值
begin
右移,end
左移,继续找大找小,继续交换
- 重复上述操作,直到遍历完所有数组
2. 排序优化后问题
若是max
的位置与begin
重合,则begin
先与min
的位置交换,此时max
位置的最大值被交换走,导致end
与max
交换的数值是错误的
max
与begin
重合
begin
先与min
的位置交换数据,此时max
位置的已经不是最大值了
max
再与end
位置交换数据,排序就发生了错误
如何解决问题呢?
当max
与begin
重合时,begin
与min
交换后导致max
指向的不再是最大值,所以当我们对begin
交换后,就要对max
进行一个修正,让max
指向最大值,然后完成end
的交换
max
与begin
重合,并且begin
此时完成了交换,此时最大值已经交换到了min
所指向的位置
- 对
max
进行修正并完成与end
的交换
3. 优化代码的实现
//交换两个数据
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//选择排序
void SelectSort(int* arr, int size)
{int begin = 0;int end = size - 1;while (begin < end){int max = begin;int min = begin;int i = 0;for (i = begin+1; i <= end; i++){if (arr[i] < arr[min]){min = i;}if (arr[i] > arr[max]){max = i;}}Swap(&arr[begin], &arr[min]);if (begin == max) //修正max{max = min;}Swap(&arr[end], &arr[max]);begin++;end--;}
}
四、选择排序的效率
- 时间复杂度:O(n2)O(n^2)O(n2)
- 空间复杂度:O(1)O(1)O(1)
选择排序是不稳定的排序
选择排序是最简单的排序算法之一,最大的优点就是很好理解,但是无论排序数组是否有序,选择排序的执行次数都不发生改变,效率一直保持这比较低的水平,所以在实际应用中几乎不使用
【排序算法】选择排序(C语言)相关推荐
- C语言基础排序算法-选择排序
C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...
- C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序
常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...
- Java排序算法——选择排序
Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...
- python排序算法-选择排序
python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法-选择排序-堆排序
排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...
- 排序算法---选择排序(java版)
简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...
- 排序算法--选择排序(Java实现)
选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...
- 排序算法——选择排序法(Select Sorting)
选择排序(Select Sorting) 基本介绍 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 选择排序(Selec ...
- 经典排序算法-----选择排序(C语言实现)
算法表述: 选择排序的基本原理是以序列首元素位置为基准位置,每次将该基准位置的元素和后面元素逐个进行比较,挑选最大或者最小的那个数放在基准位置上,一趟比较结束后,然后将基准位置设置为该位置的下一位置, ...
最新文章
- ADAS虚拟车道边界生成
- 负载均衡算法-轮询均衡
- python 下载图片损坏_爬虫爬取出的图片下载出错,图片文件直接损坏
- linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录
- Glide加载相同地址图片,不缓存
- 硝烟中的Scrum和XP-我们如何实施Scrum 4 (Part 1/2)
- 用户'MYCOMPUTER\ASPNET' 登录失败”的解决方法
- MAC安装JDK详细教程
- Java SSM框架简介
- 前端主流框架双向绑定实现原理简述
- PCB设计指南:安规、布局布线、EMC、热设计、工艺
- 数据分析从零到精通第二课 Hive和Spark入门
- RK3328量产刻录完整镜像
- 详细讲解二极管的钳位电路和限幅电路
- 思科交换机接口配置trunk_Cisco交换机配置VLAN与TRUNK
- SVN使用教程(二)
- nacos连接mysql失败_完美解决MySQL通过localhost无法连接数据库的问题
- SkeyeVSS综合安防监控Onvif、RTSP、GB28181安防协议互联网无插件直播点播解决方案
- css设置元素 网页高度自适应,css高度自适应如何实现?css高度根据内容自适应的简单方法...
- windows操作系统实验之影子账户