算法设计第5次作业

题目如下:
Problem 1: DC for selecting the k-th smallest
For the given algorithm below 1 for selecting the k-th smallest from array, prove that
its average time complexity is Θ(n)
1 template T;
2 T QuickSelect (T a [ ] , int left , int right , int k )
3 {
4 if (right < left)
return a [left] ;
5 m=partition ( a , left , right ) ;
6 i f (m−left==k−1) return a [m] ;
7 else if (m−left >= k )
8 return QuickSelect (A, left , m ‒ 1 , k ) ;
9 else return QuickSelect (A,m+1,right , k ‒ (m+1 ‒ left ) ) ;
10 }
证明该算法的时间复杂度为Θ(n)
partion函数应该是二分
那么第一步 找到a[]中的中间的元素(利用一次快排),现在比m小的都在左边,比m大的都在右边。如果m-left = k-1,那么a[m]即是第k大的元素。如果m-left>=k,那么第k大的元素会在m的左边的数组里,那么递归调用(A,left,m-1,k);否则的话第k大的元素会在m右边的数组里,且为第k-(m+1-left)个大的元素,此时递归调用右边即可。
可见这个函数是个递归调用的函数,分析时间复杂度的关键在于partition函数
int partition(a,left,right){
j=left,i= a[j],x=right; // Θ(1)
while(j < x){
while(j < x && a[x]>i)
x–;
if(j < x ) swap(i,a[x])
while(j < x &&a[j] < i)
j++;
if(j < x)swap(i,a[j]);
}
这个函数复杂度为Θ(n)
T(n) = T(n/2) + cn
= T(n/4) + (1+1/2)cn

= T(1) + (2-1/n)cn
所以 T(n) = Θ(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值