数据结构 - 简单选择排序法

在之前的博文里已经介绍过排序的两个基本方法:

双重循环法和冒泡排序法。

基本思想

其实上面两种方法的基本思想都是一样的:

就是将排序步骤分成两层循环, 在内层的每1个循环中, 找出剩下未排序成员最小(大)的1个, 并将其放到队伍前列。

只不过, 冒泡排序法的元素交换更具效率, 通常情况下会比双重循环法更快完成排序。

这次介绍的简单选择法的本质也和上面两种方法一样的。

冒泡(or 双层循环)排序法每1个内层循环中, 会通过多次元素交换, 最终最小(大)的未排序元素会被移动到队伍前列。

而简单选择法就是定1个最小变量, 在1个内层循环中, 通过比较(而不是元素交换)得到未排序的最小(最大)元素的位置。然后才1次过把这个元素移动到前列。

简单选择排序法 代码

如果你看懂上面写的是什么, 代码是很容易写出来的。

int simpleSelectionSort(int * arr, int len){int i,j;int min;for (i = 0; i < len -1; i++){min = i; //first make the first element to be the minfor (j = i+1; j < len; j++){if (arr[j] < arr[min]){min = j;}}//then the arr[j] is the min element in the loopif (i != min){_swap(arr, i, min);}}}

代码分析

上面代码很简单, 在每1个内循环中, 我们会用min这个变量来存储最小的元素位置。
然后用未排序元素来跟min位置元素比较…

debug信息:

4, 1, 5, 8, 0, 3, 7, 9, 6, 2
step 0: changed: *0, 1, 5, 8, *4, 3, 7, 9, 6, 2
0, *1, 5, 8, 4, 3, 7, 9, 6, 2
step 1: changed: 0, 1, *2, 8, 4, 3, 7, 9, 6, *5
step 2: changed: 0, 1, 2, *3, 4, *8, 7, 9, 6, 5
0, 1, 2, 3, *4, 8, 7, 9, 6, 5
step 3: changed: 0, 1, 2, 3, 4, *5, 7, 9, 6, *8
step 4: changed: 0, 1, 2, 3, 4, 5, *6, 9, *7, 8
step 5: changed: 0, 1, 2, 3, 4, 5, 6, *7, *9, 8
step 6: changed: 0, 1, 2, 3, 4, 5, 6, 7, *8, *9
change count: 7
compare count: 45
0, 1, 2, 3, 4, 5, 6, 7, 8, 9

可以见到这个简单选择排序方法不能减少比较次数, 但是大大减少了元素交换的次数。
简单选择排序法的时间复杂度仍然是O(n2n^{2})

小结

其实本文一开始提到的博文中提到, 冒泡排序法通过优化是能够元素比较次数的。

如果你的排序元素交换的开销比比较开销大得多的话,这个简单排序法是可以考虑的.

数据结构 - 简单选择排序法相关推荐

  1. 求水仙花数 以及 最大公约数最小公倍数 以及 冒泡法 以及字母大小写的转换 以及简单选择排序法 以及斐波那契数列

    什么是水仙花数呢? 假设一个数ABC是一个三位数. 水仙花数就是 A*A*A +B*B*B +C*C*C = ABC; 水仙花的具体代码. 接着是最大公约数以及最小公倍数 如果两个数是ab,最大公约数 ...

  2. 数据结构-简单选择排序(C语言)

    文章目录 1.基本思想: 2.例子讲解: 3.代码实例C语言: 4.时间复杂度分析 1.基本思想: 第i趟排序开始时,当前有序区和无序区分别为R[0-i-1],R[i-n-1] (0<=i< ...

  3. C语言 简单选择排序法

    简单选择排序是指一种排序算法,在简单选择排序过程中,所需移动记录的次数比较少.最好情况下,即待排序记录初始状态就已经是正序排列了,则不需要移动记录. 一.基本思想 在要排序的一组数中,选出最小的一个数 ...

  4. 《大话数据结构》第9章 排序 9.4 简单选择排序

    9.4.1 简单选择排序算法 爱炒股票短线的人,总是喜欢不断的买进卖出,想通过价差来实现盈利.但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少.还有一种做股票的人,他们 ...

  5. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  6. 简单选择排序_一文带你读懂排序算法(一):冒泡 amp; 快速选择排序 amp; 简单插入排序算法...

    点击上方「蓝字」关注我们 排序是确保数据规则有序的有效手段.日常开发里,我们常用到的是"冒泡"."插入排序"."选择排序"三种.大部分情况下 ...

  7. 七种排序------简单选择排序(Simple Selection Sort)

    简单选择排序法就是通过 n - i 次关键字间的比较,从 n - i + 1个记录中选出关键字最小的记录,并和第 i 个记录交换. 代码如下: void SelectSort(SqList *L) { ...

  8. 经典算法之冒泡排序法与直接选择排序法

    活动地址:21天学习挑战赛 文章目录 一.冒泡排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 二.直接选择排序法 1.基本思想 2.算法步骤 3.代码实践 4.复杂度分析 一.冒泡排 ...

  9. 数据结构-选择排序(简单选择排序,堆排序)

    目录 1,简单选择排序 1.1,简单选择排序思想 1.2,选择排序的时间复杂度分析 1.3,简单选择排序代码实现 2,堆排序 2.1,什么是堆排序 2.2,堆排序的思想 2.3,堆排序时间复杂度分析 ...

最新文章

  1. 通da信TCP长连接数据算法分析
  2. spring cloud互联网分布式微服务云平台规划分析--服务统一配置中心
  3. VB.NET 2010 如何在类Class1中调用timer事件 触发 的方法
  4. 使用命令行对Android应用签名
  5. JavaScript中null与undefined的比较
  6. 剪切文件_lammps模拟带缺陷镍板剪切变形(in文件及注释)
  7. 《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较
  8. 每日集成Tip: CruiseControl.Net 提示DLL文见找不到的解决方法
  9. Silverlight与Asp.net之间的调用及参数传递
  10. leetcode题解434-字符串中的单词数(双指针经典)
  11. php mysql 简单,你想不到的最简单php操作MySQL
  12. 记录HttpWebRequest辅助类
  13. SI 9000 及阻抗匹配学习笔记(二)
  14. 最新苹果CMSV10视频电影网站源码+自适应手机版
  15. cwRsync 文件备份
  16. 用Now SMS/MMS 发送中国移动彩信
  17. 单片空间后方交会 python实现
  18. 电子产品使用感受之--小米床头灯第二代使用体验分享
  19. 中国计算机专业的大学生相比于美国差在哪里?
  20. 计算机编程 计算存款利息,作业报告12 定期存款利息计算器

热门文章

  1. buu-crypto-yxx
  2. MySQL—相关子查询
  3. DRF—Mixin拓展类、视图集
  4. 833c语言程序是什么,江南大学
  5. SQL语法之基础查询(进阶1)and条件查询(进阶2)
  6. 2019信安国赛逆向easyGo,bbvvmm题解
  7. 记一次 Git 操作的糟心之旅
  8. Codeforces Beta Round #4 (Div. 2)【完结】
  9. 第一章 操作系统引论
  10. Servlet的默认设置