精妙的Stooge排序算法

精妙的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)。 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值