我的机器学习教程「美团」算法工程师带你入门机器学习  以及 「三分钟系列」数据结构与算法  已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。

欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~

之前两篇文章我们了解插入排序和它的衍生方法shell排序,那么今天我们来看看基于另一种算法思想的排序方法——选择排序。

一、算法思想

和直接插入排序相同,我们采用原地排序(即只用一个数组进行排序),分为有序区间和无序区间。具体思想则是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。

那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。

举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。

另一种基于选择思想的排序方法叫做堆排序,它利用了完全二叉树的性质,是一种高效的排序方法。具体思想可以参看一位大神 的一篇文章:浅谈堆排序

二、算法步骤

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

三、算法分析

一般来说选择比冒泡效率高,因为只要交换一次,但是冒泡也可以只记录坐标然后做一次性变换,只是牺牲空间复杂度。但是冒泡有个很大的优点就是它可以检测整个数组是否已经有序,当某次遍历没有发生任何交换的时候你就可以提前终止了。也算是个小优化吧。

排序方法 时间复杂度 空间复杂度 稳定性 复杂性
平均情况 最坏情况 最好情况
选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定  简单

另外对于选择排序和冒泡排序的比较,我觉得可以用逆序数来理解,假设我们要从小到大排序,一个数组中取两个元素如果前面比后面大,则为一个逆序,容易看出排序的本质就是消除逆序数,可以证明对于随机数组,逆序数是O(N^2)的,而如果采用“交换相邻元素”的办法来消除逆序,每次正好只消除一个,因此必须执行O(N^2)的交换次数,这就是冒泡、插入等算法只能到平方级别的原因,反过来,基于交换元素的排序要想突破这个下界,必须执行一些比较,交换相隔比较远的元素,使得一次交换能消除一个以上的逆序,希尔、快排、堆排等等算法都是交换比较远的元素,只不过规则各不同罢了。

因此,选择排序总是会比冒泡排序效率高,因为选择排序每轮至多只交换1轮逆序,但从算法角度考虑,时间复杂度并没有什么改进,因为都是O(n^2)算法。

四、算法实现

代码在VC++环境下编译通过

/**选择排序
test version 1::
**/#include <stdio.h>
#include <stdlib.h>
#include <string.h>#ifndef N
#define N 10
#endif // Ninline int swap(int *s1, int *s2)   //交换函数
{int tmp;tmp = *s1;*s1 = *s2;*s2 = tmp;
}inline int Select_Sort(int *arr, int len)
{register int i, j;for(i = 0; i != len ; i++){for(j = i + 1;j != len; j++) //其实这里用while更好{if(arr[i] > arr[j]){swap(&arr[i], &arr[j]);}elsecontinue;}}
}int main( int argc, int *argv[])
{//testprintf("please enter 10 numbers: \n");int i, arr[N];for(i = 0;i < N;i++){scanf("%d", &arr[i]);}int len = sizeof(arr) / sizeof(arr[0]);Select_Sort(arr, len);printf("\n");printf("the ordered array is: \n");for(i = 0;i < N;i++){printf("%4d", arr[i]);}return 0;
}

有趣的算法(八):3分钟看懂选择排序(C语言实现)相关推荐

  1. 十分钟看懂数据库——数据库入门级语言总结

    从sql入门经典,到sql视频,再到自考的数据库系统原理,不知不觉中我们已经走进了数据库的世界,那么什么叫数据库,他又是干什么用的呢? 咱们先看一下百度给的解释啊. 数据库(Database)是按照数 ...

  2. 量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法

    原标题:漫画 | 10分钟看懂量子比特.量子计算和量子算法 请做好准备,即将进入烧脑模式! 宏观世界的生活经验很多都是表象.比如,你可能认为世界的运行是确定的.可预测的:一个物体不可能同时处于两个相互 ...

  3. 十分钟看懂图像语义分割技术

    转载于:十分钟看懂图像语义分割技术 大多数人接触"语义"都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复.嗯,看到这里你应 ...

  4. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  5. python和java一样吗-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  6. python和java的区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  7. 【游戏客户端】5分钟看懂商店拍卖系统

    [游戏客户端]5分钟看懂商店&拍卖系统     大家好,我是Lampard~~     最近刚研究完图的最短路径算法[20分钟回顾四大寻路算法],现在终于有空腾出时间写一篇游戏系统的分享了. ...

  8. 图像拾取点_10分钟看懂Photoshop 照片修饰(用“消失点”滤镜编辑照片)

    "消失点"滤镜具有特殊的功能,它可以在包含透视平面(如建筑物侧面或热和矩形对象)的图像中进行透视校正.在应用诸如绘画.仿制.拷贝或粘贴,以及变换等编辑操作时,Photoshop可以 ...

  9. 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...

    网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制 现在的生活中,无论你是一名上班族还是学生或者什么职业,遇到不会的问题,总是需要上网查资料,找到某些好用的资料,却因为某些原因需要付费才能复制 ...

  10. 三相逆变器双pi控制器参数如何调节_一分钟看懂维也纳三相整流器

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

最新文章

  1. This Gradle plugin requires a newer IDE able to request IDE model level 3.For Android Studio this
  2. 干货讲解 | OKT507-C开发板基于Linux系统的应用笔记
  3. dm-haiku 用法
  4. python类装饰器详解-Python装饰器详解
  5. C#关于参数为null(空值)的方法调用,重载顺序选择彻底研究
  6. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片
  7. js确保正确this的几种写法
  8. MOCTF-Web-Flag在哪?
  9. react 事件处理_在React中处理事件
  10. C++基础学习教程(一)
  11. notepad文件太大打不开怎么办_U盘数据如何恢复?U盘打不开怎么办?
  12. 大型网站限流算法的实现和改造
  13. 算法与数据结构(九) 图论:最短路径问题
  14. [渝粤教育] 厦门工学院 逻辑与批判性思维 参考 资料
  15. pygame判断鼠标左键_鼠标科普,选对鼠标用好鼠标。
  16. 家庭WIFI排障思路
  17. 把m个球放到n个盒子里,有多少种方法 球盒问题,8种情况
  18. Prove the EXACT 4SAT is NP-complete.
  19. 肺炎期间,送上一份家庭健身计划
  20. 孩子不是绑架婚姻的借口

热门文章

  1. 几种.NET平台数据持久化框架介绍
  2. 【你敢说你懂JS吗】——JS测试
  3. 嵌入式基础面八股文——并发,同步,异步,互斥,阻塞,非阻塞的理解(2)
  4. 小米笔试题--数组移动
  5. 推荐一个程序员阅读文章资料时的辅助神器
  6. php 过滤掉多维数组空值
  7. 转场动画UINavigationControllerDelegate
  8. 容量规划的一些探讨与实践
  9. 5-01表达基本概念
  10. 深入浅出SharePoint——站点的部署