稳定排序与不稳定排序的区别

稳定和不稳定排序详解

参考:https://www.jianshu.com/p/7c03e5eb143c

稳定排序有:插入排序、冒泡排序、归并排序、基数排序

不稳定排序有:选择排序、快速排序、希尔排序、堆排序

稳定排序

插入排序

  • 在一个有序的序列中插入一个数,使插入后的序列保持有序。

  • 因为插入的过程中都是从后向前进行查找,遇到小于等于(或大于等于)的数停止寻找,进行插入操作。

  • 不改变排序前后相等数值的相对顺序,故使稳定的排序算法。

冒泡排序

  • 冒泡故名思义,数值小的向上飘,数值大的向下沉,向上飘的数遇到的小于等于当前数的值停止,向下沉的数遇到大于等于当前数的数停止,

  • 类似于对于向上飘的数有个排序之前在其前面数值相等限制了其向上飘的脚步,原先在俺之下,排序后也在俺之下,向下沉也是同理。故也是稳定的排序算法。

归并排序

  • 将一段序列分为若干个小序列进行排序,排序后的小序列进行合并得到最后的排序结果。

  • 主要运用了分治的思想。

    • 分成的前后若干个小序列在最后进行合并时本身就包含了前后位置信息,在合并时不改变相同值在排序前后的相对顺序,故归并排序也是稳定排序。

基数排序

  • 按从低到高的相应位的值进行排序,也是稳定排序算法。

不稳定排序算法


非稳定排序算法包括:选择排序、快速排序、希尔排序、堆排序*

选择排序:

  • 主要思想是分别找出当前遍历元素中的最小值与相应位置的数进行交换,

  • 第一遍寻找元素的从第一个元素起的最小值(或最大值)和第一个元素进行交换,第二趟寻找从第二个元素起最小的(或最大的)元素与第二个元素进行交换,以此类推。

例子如下:[4,4’,2] 排序后 [2,4’,4]

快速排序

  • 快速排序是指通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。

这里可以使用例子进行记忆:以5作为基准,从最右元素找到小于5的元素3`

然后将5和3`进行互换, 就会发现3·在前面的情况,即出现了不稳定的情况。

[5,3,3,4,3’,8,7] 排序后[3’,3,3,4,5,8,7]

希尔排序

  • 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止

image.png

一次插入排序是稳定的,多次插入排序不是稳定的。

[3,3`,2,4]

最终的结果为:

[2,3`,3,4]

其中3和3`的顺序发生变化。

堆排序

  • 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

    比如:3 27 36 27,
    如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。