排序算法稳定性总结

来源:互联网 发布:淘宝玩具专卖 编辑:程序博客网 时间:2024/04/26 18:34

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

1、选择排序:第i轮时,扫描未排序序列/后半部分中找到“最小”/第i小元素,与i位置元素交换。即发生了非相邻元素的交换,如果两个交换元素之间存在元素与i位置元素相等,则会改变两个相等元素的先后顺序,所以不稳定!

2、插入排序:第i轮时,将i+1位置元素从后向前依次与前半部分(有序)元素比较,插入到小于等于的元素之后,因此不会改变两个相等元素的先后顺序,稳定!

3、冒泡排序:所有的比较和交换均发生在两个相邻元素,如果两个元素相等则不会发生交换,因此不会改变相等元素的先后顺序,稳定!

4、快速排序:“中轴元素”将序列分为两部分,再将中轴元素交换到中间,因此当中轴元素为两个相等元素之一时,就会导致先后顺序发生改变,不稳定!

5、归并排序:递归排序是把序列递归的分成短序列,递归的出口是段序列为一个(认为有序)或两个元素(依次比较和交换后有序),然后将短序列合并为一个有序的长序列。可以看到一个元素时不会发生交换,两个元素时最多交换相邻元素,不可能破坏相等元素的次序,稳定!

6、希尔排序:步长为1之前的步长,由于会交换不相邻的元素,如果待交换元素之间存在与这两个元素相等的元素,就会导致相等元素的先后顺序发生改变,所以不稳定!

7、基数排序:基数排序是按照低位先排序,然后收集;按照次低位排序,再收集,以此类推直到最高位。基数排序基于分别排序分别收集,所以是稳定的!

8、堆排序:交换了不相邻元素,可能会破坏两个相等元素的次序,不稳定!

总结:

不稳定:当出现交换两个不相邻元素时,由于它们中间的某元素有可能与要交换的两个元素相等,会破坏相等元素的次序,是不稳定的。e.g..选择排序、快速排序、希尔排序和堆排序。

稳定:如果元素的交换只发生在两个相邻元素,肯定是稳定的,e.g..冒泡排序、归并排序、基数排序;插入排序由于会从相邻元素开始比较,最后小于等于的元素之后,也保证了不可能会破坏两个相等元素的顺序,因此也是稳定的。

0 0