排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。
对于希尔排序的不稳定性:一直没搞明白其不稳定的原因,今天突然想明白了,因为虽然每一组内的排序不会改变相同关键字的相对位置,但是当相同关键字在不同的分组中的时候,其相对位置就可能发生改变。
举个例子1 3 2 2。gap=2时, 1 3 2 2分组如图所示,蓝色一组,绿色一组,两个2虽然关键字相同但是被分到了不同的分组当中,每个分组内进行排序, 1 2 2 3,绿色分组排序不变,而蓝色分组中2和3交换顺序,这就导致蓝色的2被排到绿色2的前面,从而改变了两个2的相对顺序。
一般认为稳定的算法:冒泡排序,直接插入,归并排序等
一般认为不稳定的算法:快速排序(基准元素与最后的i会发生交换),希尔排序(不同分组中相同元素会改变相对顺序),堆排序等