ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

Stooge排序

  《算法导论》7-3看到了这个好东东,beautiful-sort,代码确实漂亮。不愧是教授啊,Howard,Fine,膜拜ing.
int stooge_sort(int a[],int s,int t)
{
    
int k;
    
if (a[s]>a[t])
        swap(a[s],a[t],k);
    
if (s+1>=t)
        
return 0;
    k
=(t-s+1)/3;
    stooge_sort(a,s,t
-k);
    stooge_sort(a,s
+k,t);
    stooge_sort(a,s,t
-k);
}

a) 证明:如果n=Length[A],那么STOOGE-SORT(A, 1, Length[A])能正确地对输入数组A[1..n]进行排序。

循环不变式:过程STOOGE-SORT(A, i, j)被调用后,数组A中[i, j]区间内的元素是有序的。
初始化:i+1>=j时,[i, j]区间中只有一个或者两个元素,唯一的操作就是 if A[i]>A[j] then exchange A[i]<->A[j],显然循环不变式是成立的。
保 持:每一次STOOGE-SORT(A, i, j)被调用时,假设循环不变式成立。则调用STOOG-SORT(A, i, j-k)使得区间[i, j-k]有序,调用STOOG-SORT(A, i+k, j)使得区间[i+k, j]有序。因为k=(j-i+1)/3,所以区间[i, j-k]和区间[i+k, j]的重叠部分区间[i+k, j-k]的元素个数为[i, j]中元素个数的1/3,也为k个。因调用STOOG-SORT(A, i, j-k)后区间[i, j-k]有序,所以区间[i+k, j-k]中的元素应该是区间[i, j-k]中最大的k个元素,于是调用STOOG-SORT(A, i+k, j)后可以保证区间[j-k+1, j]中包含区间[i, j]中最大的k个元素并且是有序的。因此可保证在第二次调用STOOG-SORT(A, i, j-k)后区间[i, j]有序。
终止:STOOGE-SORT(A, i, Length[A])调用结束后,根据循环不变式,数组A中的元素是有序的。

b) 给出一个表达STOOGE-SORT最坏情况的运行时间的递归式,以及关于最坏情况运行时间的一个紧确的渐进(Θ记号)界。

T(n)=3T(2n/3)+Θ(1)

根据主定理:

a=3    b=3/2    f(n)=Θ(1)

故有 f(n)=O(n^log(3/2, 3-ε))  (ε>0)

所以 T(n)=Θ(n^log(3/2, 3))>Θ(n^2)


复制了大牛的文章过来,没事自己看看。

不过怎么觉得Thomas.H.Cormen等人有点讽刺讽刺这几个教授呢??

posted on 2012-03-21 11:05 wangs 阅读(473) 评论(0)  编辑 收藏 引用 所属分类: ACM-201203


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理