(1) 首先按最低位字母进行排序得到SEA,TEA,MOB,TAB,DOG,RUG,DIG,BIG,BAR,EAR,COW,ROW,NOW,BOX,FOX;
(2) 然后对次低位字母进行稳定排序得到TAG,BAR,EAR,SER,TEA,DIG,BIG,MOB,DOG,COW,ROW,NOW,BOX,FOX,RUG;
(3) 最后对首位字母进行稳定排序得到BAR,BIG,BOX,COW,DIG,DOG,EAR,FOX,MOB,NOW,ROW,SEA,TAB,TEA。
插入排序,归并排序和快速都是稳定排序,只有堆排序不是稳定的。
对于堆排序,可以修改MAX-HEAPIFY算法的第3到第7行如下:
3 if l <= A.heap-size and A[l] >= A[i]
4 largest = l
5 else largest = i
6 if r <= A.heap-size and A[r] >= A[largest]
7 largest = r
当节点 i 的左右孩子节点中有一个与其相等时,将会造成多一次的交换,额外时间为 Θ(n) ,没有造成额外空间消耗。
我们可以归纳证明对于基数排序,当他进行完第 i 列时,由第1列到第 i 列的关键字构成的数的数组是已排好序的。
(1) 首先,当 i=1 时,我们本来就是对第1行进行排序,所以显然正确;
(2) 然后我们假设当 i=k−1 时,由第1列到第 k−1 列关键字构成的数的数组是已排好序的,那么当 i=k 时,因为第 i 列是最高位,所以最高位的大小决定了整个数的大小;当第 i 列相等时,由低位决定大小,由底层排序算法稳定,所以保持了其大小顺序,所以原假设正确。
所以当最后 i=d 时,由第1列到第 d 列,也即整个完整的数组已排好序。
将所有的整数作为以n为基的3位的数来调用基数排序,此时 d=3 , k=n ,所以该方法的时间复杂度为 Θ(3(n+n))=Θ(n) 。
最坏的情况下,对于每一位上的排序都要分成 d 位子问题,一共就需要进行 ∑d−1i=010i 轮排序,一共需要记录 ∑di=110i 堆卡片。