精妙的Stooge算法:
STOOGE-SORT(A, i, j) {
if A[i] > A[j]
then exchange A[i] and A[j]
if i + 1 >= j
then return
k = (j - i + 1) / 3
STOOGE-SORT(A, i, j - k) // First two-thirds
STOOGE-SORT(A, i + k, j) // Last two-thirds
STOOGE-SORT(A, i, j - k) // First two-thirds again
}
1.首先从感性上分析,取序列 3 1 4 1 5 9 2 6 :
第一次调用STOOGE-SORT: 3 1 4 1 5 9 2 6 (i = 1, j = 8, k = 2)
第一次递归调用STOOGE-SORT: 3 1 4 1 5 9 (i = 1, j = 6, k = 2, first 2/3)
第二次递归调用STOOGE-SORT: 3 1 4 1
1 1 4 3 (i = 1, j = 4, k = 1, first 2/3)
第三次递归调用STOOGE-SORT: 1 1 4 (i = 1, j = 3. k = 1, first 2/3)
第四次递归调用STOOGE-SORT: 1 1 (i = 1, j = 2. first 2/3, return到上一层)
第五次递归调用STOOGE-SORT: 1 4 (i = 2, j = 3, second 2/3, return到上一层)
第六次递归调用STOOGE-SORT: 1 1 (i = 1, j = 2, first 2/3, return到上一层)
得到114 (first 2/3结束)
第七次递归调用STOOGE-SORT: 1 4 3 (i = 2, j = 4, k = 1, second 2/3)
第八次递归调用STOOGE-SORT: 1 4 (i = 2, j = 3, first 2/3, return到上一层)
第九次递归调用STOOGE-SORT: 4 3 (i = 3, j = 4, second 2/3)
3 4 (return到上一层)
1 3 (i = 2, j = 3, first 2/3, return到上一层)
得到134 (second 2/3结束)
第十次递归调用STOOGE-SORT: 1 1 3 (i = 1, j = 3, k = 1, first 1/3)
第11次递归调用STOOGE-SORT: 1 1 (i = 1, j = 2, first 2/3, return到上一层)
第12次递归调用STOOGE-SORT: 1 3 (i = 2, j = 3, second 2/3, return到上一层)
第13次递归调用STOOGE-SORT: 1 1 (i = 1, j = 2, first 2/3, return到上一层)
得到114 (first 2/3结束)
得到1134 (first 2/3结束)
这时子序列变成1 1 3 4 5 9。对于3 4 5 9,用同样的递归步骤得到3 4 5 9,然后返回到第一次递归调用STOOGE-SORT下面的一句,即递归地对子序列3 4 5 9 2 6排序,得到3 4 2 5 6 9。最后对序列的first 2/3也就是子序列1 1 3 4 2 5递归排序,得到1 1 2 3 4 5,最后得到序列的正确排序,即:
1 1 2 3 4 5 6 9。
2.证明算法的正确性:
(1) 当n = 3时,很显然算法能够对序列正确排序
(2) 当n = 4时,k = 1。由(1)可知,可以令4个数中的前3个和后3个都有序,首先对前3个数排序,通过排序可知最大的数为第3个,这时序列的最大值不是第3个数就是第4个数,通过接着对后3个数排序,可确定两次排序后的序列的最后1个数最大,但是这最大的数是第二次排序前的第3个数还是第4个数是未知的(对于程序代码来说),如果是第3个数最大,那么第4个数在第二次排序后,将位于第二个或第三个位置,因此最后还要对前3个数排序,3次排序之后,序列则是正确排序的。
(3) 当n = 5时,k = 1。由(2)可知,可对n = 4的序列正确排序,因此前4个和后4个数都是有序的,又因为第5个数在第二次排序后在哪个位置是未知的(对于程序来),有5个可能性:在第5个位置,这时就不需要第三次排序了,整个数列已经是有序的,在第4、3、2个位置,这就需要再对前四个数进行排序,最后得到有序序列。
(4) 同理可证当n = N时,序列能够正确排序。
3.STOOGE-SORT最坏情况下的递归式和最坏情况运行时间的紧确渐进界:
递归式:T(n)=3T(2n/3)+⊙(1)
可用主定理确定STOOGE-SORT运行时间的紧确渐进界,主定理如下:
设a>=1和b>1为常数,设f(n)为一常数,T(n)由递归式T(n)=aT(n/b) + f(n)对非负整数定义,其中n/b为上取整或下取整。那么T(n)可能由如下的渐进界:
1)若对于某常数m>0,有f(n)=O(n^log(b)(a-m)),则T(n)=⊙(n^log(b)a);
2)若f(n)=⊙(n^log(b)a),则T(n)=⊙((n^log(b)a)lgn);
3)若对某常数m>0,有f(n)=Ω(n^log(b)(a+m)),且对常数c<1与所有足够大的n,有af(n/b)<=cf(n),则T(n)=⊙(f(n))。
STOOGE-SORT递归式中,a=3,b=3/2,存在常数m=2,使得log(3/2)(3-2)=0,即f(n)=1,因此STOOGE-SORT的紧确渐进界为⊙(n^log(3/2)3)。