【排序算法】—— 选择排序

目录

  • 一、选择排序的原理
  • 二、选择排序的代码实现
  • 三、选择排序的优化
    • 1. 优化思路
    • 2. 排序优化后问题
    • 3. 优化代码的实现
  • 四、选择排序的效率

一、选择排序的原理

​ 选择排序算法是通过遍历数组,选择出数组的最小或最大值,与指定位置交换数据,遍历完整个数组的所有位置就完成排序

  1. 遍历第一趟数组,找出数组的最小值,与第一个数据交换

  1. 遍历第二趟数组,继续找出最小值,与第二个数据交换

  1. 重复上述动作,遍历完数组就得到一个有序数组

二、选择排序的代码实现

//交换两个数据
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次,如果我们每次不但找到最小的,还找到最大的,将最小的与左端交换,最大的与右端交换,那么就少了一半的遍历次数,从而提高效率

  1. 变量begin和变量end是数组的两端,minmax分别找小和大的下标

  1. 先交换minbegin位置的数值,再交换maxend位置的数值

  1. begin右移,end左移,继续找大找小,继续交换

  1. 重复上述操作,直到遍历完所有数组

2. 排序优化后问题

​ 若是max的位置与begin重合,则begin先与min的位置交换,此时max位置的最大值被交换走,导致endmax交换的数值是错误的

  1. maxbegin重合

  1. begin先与min的位置交换数据,此时max位置的已经不是最大值了

  1. max再与end位置交换数据,排序就发生了错误

如何解决问题呢?

​ 当maxbegin重合时,beginmin交换后导致max指向的不再是最大值,所以当我们对begin交换后,就要对max进行一个修正,让max指向最大值,然后完成end的交换

  1. maxbegin重合,并且begin此时完成了交换,此时最大值已经交换到了min所指向的位置

  1. 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语言)相关推荐

  1. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  2. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  3. Java排序算法——选择排序

    Java排序算法--选择排序(Selection sort) 传送门 冒泡排序 插入排序 简述 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找 ...

  4. python排序算法-选择排序

    python排序算法-选择排序 一.选择排序 1.一趟排序纪录最小的数,放在第一个位置 2.再一次排序记录列表无序区最小的数,放在第二个位置 关键 有序区.无序区.无序区最小数的位置 代码 def s ...

  5. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 排序算法-选择排序-堆排序

    排序算法-选择排序-堆排序 堆排序是一种树型选择排序方法.在排序过程中,将 L [ 1... n ] L[1 ... n] L[1...n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点 ...

  7. 排序算法---选择排序(java版)

    简单选择排序 原理 选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间.但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾. 简单选择排序执 ...

  8. 排序算法--选择排序(Java实现)

    选择排序概念 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中 ...

  9. 排序算法——选择排序法(Select Sorting)

    选择排序(Select Sorting) 基本介绍 ​ 选择排序也属于内部排序法,是从预排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的 选择排序思想 ​ 选择排序(Selec ...

  10. 经典排序算法-----选择排序(C语言实现)

    算法表述: 选择排序的基本原理是以序列首元素位置为基准位置,每次将该基准位置的元素和后面元素逐个进行比较,挑选最大或者最小的那个数放在基准位置上,一趟比较结束后,然后将基准位置设置为该位置的下一位置, ...

最新文章

  1. ADAS虚拟车道边界生成
  2. 负载均衡算法-轮询均衡
  3. python 下载图片损坏_爬虫爬取出的图片下载出错,图片文件直接损坏
  4. linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录
  5. Glide加载相同地址图片,不缓存
  6. 硝烟中的Scrum和XP-我们如何实施Scrum 4 (Part 1/2)
  7. 用户'MYCOMPUTER\ASPNET' 登录失败”的解决方法
  8. MAC安装JDK详细教程
  9. Java SSM框架简介
  10. 前端主流框架双向绑定实现原理简述
  11. PCB设计指南:安规、布局布线、EMC、热设计、工艺
  12. 数据分析从零到精通第二课 Hive和Spark入门
  13. RK3328量产刻录完整镜像
  14. 详细讲解二极管的钳位电路和限幅电路
  15. 思科交换机接口配置trunk_Cisco交换机配置VLAN与TRUNK
  16. SVN使用教程(二)
  17. nacos连接mysql失败_完美解决MySQL通过localhost无法连接数据库的问题
  18. SkeyeVSS综合安防监控Onvif、RTSP、GB28181安防协议互联网无插件直播点播解决方案
  19. css设置元素 网页高度自适应,css高度自适应如何实现?css高度根据内容自适应的简单方法...
  20. windows操作系统实验之影子账户

热门文章

  1. pageInfo分页无效问题
  2. QSPI寄存器学习总结
  3. android 11.0添加开机铃声
  4. OpenWrt 学习笔记【6】配置USB驱动
  5. ​2023年湖北企业人力资源管理师报考条件是什么?启程别告诉你
  6. 火锅店宣传PPT-朴尔PPT
  7. 王伟storm_【英语】宁夏银川九中2014-2015学年高一上学期期中考试
  8. 基于Android家庭食谱推荐系统app
  9. 什么是跨域问题?跨域问题怎么解决?
  10. 数据结构3 :ndarray