算法导论第七章课后答案

7.1-1 参照图7-1的方法,说明PARTITION在数组A={13,9,9,5,12,8,7,4,21,2,6,11}上的操作过程。

A={13,19,9,5,12,8,7,4,21,2,6,11}

  ={13,19,9,5,12,8,7,4,21,2,6,11}

  ={13,19,9,5,12,8,7,4,21,2,6,11}

  ={9,19,13,5,12,8,7,4,21,2,6,11}

  ={9,5,13,19,12,8,7,4,21,2,6,11}

  ={9,5,13,19,12,8,7,4,21,2,6,11}

  ={9,5,8,19,12,13,7,4,21,2,6,11}

  ={9,5,8,7,12,13,19,4,21,2,6,11}

  ={9,5,8,7,4,13,19,12,21,2,6,11}

  ={9,5,8,7,4,13,19,12,21,2,6,11}

  ={9,5,8,7,4,2,19,12,21,13,6,11}

  ={9,5,8,7,4,2,6,12,21,13,19,11}

  ={9,5,8,7,4,2,6,11,21,13,19,12}

7.1-2 当数组A[p..r]中的元素都相同时,PARTITION返回的q值是什么?修改PARTITION,使得当数组A[p..r]中所有元素的值都相同时,q=(p+r)/2.

当元素相同时,q=i+1=r-1+1=r.

修改后的函数q=(p+r)/2.

int Partition(int A[], int p, int r)
{
   int x = A[r],i=p-1;
   int flag = 1;
   for (int j = p;j< r-1;j++)
   {
       if (x >=A[i]&&flag>0)//x=A[i]时,flag大于0和小于0的数量约为一半,
       {
           i = i + 1;
           swap(A[i],A[j]);
       }
       if (x ==A[i])
       {
           flag=-flag;//这样就能让i++次数减半。
       }
   }
    swap(A[i + 1],A[r]);
   return i + 1
}

7.1-3请简要证明:在规模为n的子数组上,PARTITION的时间复杂度为Θ(n)


除了函数内数个O(1),还有一个循环,其循环次数 p-(r-1)+1=p-r次,O(p-r)=O(n)


7.1-4  如何修改QUICKSORT,使得它能够以非递增序进行排序?

仅仅需要把  x >=A[i] 改为 x <=A[i]

7.2-1 利用带入法证明:正如7.2节开头提到的那样,递归式T(n)=T(n-1)+Θ(n)的解为T(n)=Θ(n^2)  令Θ(n)=cn (c常数)。

 假设T(n)在n-1上成立。  先证明T(n)=Ο(n^2)

T(n)<=c1(n-1)^2+cn<=c1n^2 <=> (c-2c1)n+c1<=0 <=> c-2c1<0 (c<2c1) n>=c1/(2c1-c) 当0<c<2c1时,有n>=n0=c1/(2c1-c)  对于足够大的n都成立。

再证明T(n)=Ω(n^2)  T(n)>=c2(n-1)^2+cn>=c2n^2  <=> (c-2c2)n+c2>=0 <=> c-2c2>0 (c>2c2>0) n>0 当c

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值