选择排序(每次选出未排序最小的和未排序首位置交换)、

快速排序(随机选取一个值为基准,把基准放到最前面或者最后面,这就决定你排序开始的位置是从前往后还是从后往前,因为最后你要把最后一个元素与基准元素进行交换来使得基准元素位于最中间)、

希尔排序、

堆排序(构建完堆后会进行首位交换,是最大或者是最小的放在最后)

这几个不是稳定的排序算法,

冒泡排序、插入排序、归并排序(虽然和快排都是递归,但是归并更浪费空间,但是相同数据顺序不会改变)和基数排序是稳定的排序算法。

(1)冒泡排序

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。

(2)选择排序

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

(3)插入排序
     插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

(4)快速排序
    快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。 交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11, 现在中枢元素5和3交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j]交换的时刻。

(5)归并排序
    归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。

(6)基数排序
   基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

(7)希尔排序(shell)
    希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

(8)堆排序
   我们知道堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法

各种排序是否稳定,不稳定是为什么相关推荐

  1. HDU1872 稳定排序【稳定排序】

    稳定排序 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  2. 检测网络是否稳定的计算机命令,怎么测试网速稳定不稳定,3 个方便的命令行网速度测试工具...

    怎么测试网速稳定不稳定 用这三个开源工具检查你的互联网和局域网速度.-- Ben Nuttall(作者) 能够验证网络连接速度使您可以控制计算机. 使您可以在命令行中检查互联网和网络速度的三个开源工具 ...

  3. 计数排序和稳定的计数排序

    计数排序不是基于元素比较,而是利用数组下标来确定元素的正确位置.计数排序是一个稳定的排序算法.当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排 ...

  4. 原地(原址、就地)排序和稳定排序

    不了解这2个概念的同学可能会认为他俩之间有着某种一丝丝的联系,毕竟哲学上讲过万物都是联系的,但是我要说的是他们从科学概念上出发毫无联系. 上一讲就讲过稳定排序,是指在排序算法中,相同值的两个元素,在输 ...

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

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

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

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

  7. 由一道题目引发的为稳定与不稳定的排序思路

    今天为一道题目伤透了,还是因为自己的脑子不够机灵,很多地方想的不够透彻. 这个一道很典型的排序题目: http://www.cnblogs.com/lveternal/p/3413492.html 这 ...

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

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

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

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

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

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

最新文章

  1. 时间序列举例--------协方差+相关系数+随机游走+平稳性
  2. opencv基础小程序大集合
  3. elasticsearch 索引存储深入详解
  4. gateway 过滤器执行顺序_Gateway网关源码解析—路由(1.1)之RouteDefinitionLocator一览...
  5. 动手学深度学习(PyTorch实现)(五)--多层感知机
  6. 9.4. Default Gateway
  7. 安装java目录不存在_从GitHub安装R packge - “'''在当前工作目录中不存在
  8. 使用HanLP分词时,词性标注错误的问题
  9. windows下调用外部exe程序 SHELLEXECUTEINFO
  10. js 封装原生XMLHttpRequest
  11. python产品管理系统_python实现超市商品销售管理系统
  12. MIUI9线刷包精简
  13. 【小程序】一文带你了解微信小程序开发(小程序注册/开发工具的下载)
  14. idea的简单使用,初始化过程
  15. android 盈利模式
  16. MacOS 苹果系统下 OBS黑屏(屏幕录制黑屏)解决办法
  17. Qt学习笔记——获取本机网络信息(IP, 子网掩码, 广播地址,主机名
  18. Chef框架之Cookbook的介绍及应用
  19. diea社区版如何创建springboot
  20. 【数据仓库】数据仓库建模方法及企业数据中台建设

热门文章

  1. 74cms 5.0.1版本文件包含漏洞复现
  2. Linux查看日志的常用命令
  3. 什么软件可以测试睡眠质量心率,2020测睡眠质量的app排行榜-推荐10款有趣又有效的睡眠APP...
  4. android rxbus github,RxBus for Android
  5. Matlab数据拟合-----使用polyfit 和polyval函数
  6. 《Python程序设计实验指导书》81个实验项目选做参考
  7. mpa和pis_1psia等于多少mpa
  8. linux常见通配符的含义,linux通配符含义
  9. 全国省市县json数据
  10. 论文_毕业设计复现机器学习模型案例大本营(收藏)