排序算法稳定性的好处

排序算法稳定性概念

在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中

r[i] = r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,

而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

选择排序不稳定的例子:5 8 5 2 9  第一次交换之后 2 8 5 5 9

快速排序不稳定的例子:5 3 3 4 3 8 9 10 11  如果选择第一个数作为基准 , 第一次交换就是3 3 3 4 5 8 9 10 11  

希尔排序不稳定的例子:{ 3, 5, 10, 8, 7, 2, 8, 1, 20, 6 },h=2时分成两个子序列 { 3, 10, 7, 8, 20 } 和  { 5, 8, 2, 1, 6 } ,未排序之前

第二个子序列中的8在前面,现在对两个子序列进行插入排序,得到 { 3, 7, 8, 10, 20 } 和 { 1, 2, 5, 6, 8 } ,即 { 3, 1, 7, 2, 8, 5, 10, 6,

20, 8 } ,两个8的相对次序发生了改变。

堆排序不稳定的例子:{ 9, 5, 7, 5 },堆顶元素是9,堆排序下一步将9和第二个5进行交换,得到序列 { 5, 5, 7, 9 },再进行堆调整

得到{ 7, 5, 5, 9 },重复之前的操作最后得到{ 5, 5, 7, 9 }从而改变了两个5的相对次序

稳定的排序算法的好处:从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。这样,有可能减轻系统的开销。

举个例子:

在数据库操作中,如下简单表格:

2(1) 4
3 8
2(2) 5
1 2
4 9

上表格第一个列,如果需要第一列排序,且使用稳定排序算法可得到

1 2
2(1) 4
2(2) 5
3 8
4 9

如果使用非稳定的选择排序算法,则得到:

1 2
2(2) 5
2(1) 4
3 8
4 9

这样第二列并不是有序的。如果需要第二列有序,还需要再次排序一次。

猜你喜欢

转载自blog.csdn.net/wgllovemother/article/details/82801781