排序算法之稳定性

稳定性

稳定性好处:1)从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。

                      2)现实世界的业务需要稳定性,保证原始信息不被抹去、等值元素的相对位置不变动。

插入稳定:想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置;如果碰见一个和插入元素相等的,将把待插入的元素放在相等元素的后面;前后顺序未改变;

冒泡稳定:小的元素往前调或者把大的元素往后调;比较是相邻的两个元素比较,交换也发生在这两个元素之间,只有在两数不等时才可能发生交换;

归并稳定:子序列内部的相等元素不会交换;若两个子序列中有相等元素,会把处在前面的子序列保存在结果序列的前面,保证了稳定性;

基数稳定:是基于分配的排序,按照低位先分配、收集;再按照高位分配、收集;只有不等的元素之间才可能发生交换,依次类推,直到最高位;


选择不稳定:在一趟选择中,被选择的最小元素min需要和当前元素交换,min出现在一个和当前元素相等的元素后面,那么交换后稳定性就可能被破坏了;举个例子,序列5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了;

快速排序不稳定:两个方向,左边的i下标当a[i] <= a[center_index] 一直往右走,其中center_index是中枢元素的数组下标。而右边的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(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱;

shell不稳定: 一次插入排序是稳定的,但shell有多次插入排序,在不同的插入排序过程中,等值元素可能在各自的插入排序中移动使得先后顺序改变,最后其稳定性就会被打乱;

堆排序不稳定:它在交换数据的时候,是比较父结点和子节点之间的数据,所以,即便是存在两个数值相等的兄弟节点,它们的相对顺序在排序也可能发生变化。

猜你喜欢

转载自www.cnblogs.com/yuanba0527/p/11733987.html