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