首先了解一下什么叫排序算法的稳定性。定义:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

那么直接选择排序为啥不稳定呢?举个栗子,我们有一个序列:8* 3 5 4 8 3 1 9 我们用直接选择排序对它进行操作时,第一次交换就会把8*与1交换,这样序列变为了:1 3 5 4 8 3 8* 9, 8*就跑到8后面去了,而且最终排序完的序列为1 3 3 4 5 8 8* 9,可以看出8* 最终是在8后面,不满足定义里的“多个具有相同的关键字的记录相对次序保持不变”。因而直接选择排序是不稳定的。

怎样修改能使它稳定?

在假设当前记录i为最小记录,扫描所有剩余记录寻找更小记录的时候,不仅寻找最小记录而且寻找相同记录,并用数组SameArr记录下相同记录的位置(包括i,把i放数组首元素),扫描结束后找到最小记录的位置j,将数组SameArr中的最后一个与最小记录交换,然后倒序依次交换数组中的记录。举个栗子,我们有序列: 8*** 3  8** 5 8* 4 8 1 9;第一次扫描后,SameArr中保存了[0,2,4,6]四个位置,而最小记录为1(其位置为7),于是我们交换序列位置6和位置7的元素,然后按数组SameArr的倒序一次交换里面位置的元素,比如交换4和7,(因为前面6和7已经换过),等等等,最后得到序列:1  8*** 3  8** 5 8* 4 8 9;这样就不会改变相对次序。这只是我自己想到的一种方法,如有不对或者更好的方法欢迎在下方评论区讨论。

直接选择排序是不稳定的,以及怎样将它变成稳定的排序。相关推荐

  1. std中稳定排序算法_排序算法问题:稳定排序与不稳定排序

    (给算法爱好者加星标,修炼编程内功) 作者:紫红的泪 https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html 前言 排 ...

  2. [转]稳定排序和不稳定排序

    这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些 ...

  3. 稳定排序与不稳定排序方法

    稳定排序与不稳定排序方法 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj,Ai ...

  4. 选择排序(Selection sort)是一种简单直观的排序算法

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

  5. 堆排序稳定性举例_稳定排序和不稳定排序

    这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些 ...

  6. 排序算法的稳定性 (什么样的排序是不稳定的)

    有两个6,a[0]和a[3].排序结果就有两种可能: 如果排序结束后,a[0]可以保证一定在a[3]前头,也就是他们原有的顺序不变,那这种排序算法就是稳定的.(比如常见的冒泡排序.基数排序.插入排序. ...

  7. 稳定排序与不稳定排序的定义

    如果队列中存在两个相等的数字排序过程中 这两个数字的先后顺序如果不会发生变化 就叫做稳定的排序反之叫做不稳定 参考文章:稳定排序和不稳定排序.

  8. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  9. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

最新文章

  1. Nagios—服务和性能监控
  2. isnull pivot server sql_多行转换成多列 pivot解决方案
  3. Coursera课程Python for everyone:chapter4
  4. 自动化测试8大元素定位之xpath语法
  5. 电脑边充电边用好吗_平板电脑充电推车厂家哪家好?
  6. Android混流技术,基于Android的实时语音混沌保密技术的实现
  7. 岁月悄然前行,没有停留的痕迹
  8. C#中利用Linq.Dynamic实现简单的动态表达式构建查询
  9. Spark GraphX 的数据可视化
  10. 君が呼ぶ メギドの丘で 美吉特之丘的呼唤 游戏感想
  11. 在Oracle的FORM中对不同的状态采取不同的颜色显示
  12. Java实现十大排序算法
  13. ubuntu安装rubyOnRails
  14. 一次性通过CISSP考试之旅
  15. 威纶通触摸屏控制台达变频器
  16. OpenCV创始人Gary Bradski,现已加入蓝胖子机器人
  17. Html5 视频播放之video标签的使用(包含注意事项,例如视频无法正常展示,只显示音频等问题)
  18. LSH 近似最近邻查找
  19. BookKeeper设计介绍及其在Hadoop2.0 Namenode HA方案中的使用分析
  20. 【LeetCode】190. 颠倒二进制位 easy / bitset / stoul

热门文章

  1. websql线上sql查询
  2. 华为鸿蒙os和吉利汽车,华为鸿蒙OS又有吓人的设计 苹果的Carplay在鸿蒙OS面前真的自叹不如...
  3. 发那可g10_FANUC加工中心G10
  4. openpyxl——多表合并以及数据汇总
  5. 学堂在线《工程伦理》第十一章课后习题及答案(仅供参考)
  6. 被动学习VS自主学习
  7. Python:实现A-Star算法(附完整源码)
  8. Adobe Fireworks CS6 安装完提示无法访问Adobe服务器 请检查Internet链接或防火墙设置(错误代码:P206)
  9. Editplus高级搜索方法 统计字符串出现次数 显示搜索结果
  10. 地图坐标转换(火星坐标系、百度坐标系、谷歌、腾讯、高德等坐标)