7.1-1
这个如果理解了这节内容的话,还是很好演示的。略
7.1-2
(1)当数组的所有元素相同的话,i每次都需要+1操作,在循环结束后i=r-1,返回的是r
(2)只需要在循环内部加上相等判断,间断的让i+1即可
public static int partition_2(int[] arr,int p,int r) {
int x = arr[r];
int i = p - 1;
boolean flag = true;
for(int j = p;j <= r - 1;j++) {
if(arr[j] < x || (arr[j] == x && flag == true)) {
i = i+1;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
if(arr[j] == x) {
flag = !flag;
}
}
int temp = arr[i+1];
arr[i+1] = arr[r];
arr[r] = temp;
return i+1;
}
7.1-3
partition中for循环结构的时间复杂度是Θ(n),其他执行语句都为Θ(1),所以相加最后得Θ(n)。
7.1-4
只需要将for循环中的if判断改为 > 或 >= 即可
7.2-1
T(n)≤ c₁(n-1)² + Θ(n)
= c₁n² -2c₁n +c +Θ(n)
≤ c₁n² (Θ(n)-2c₁n+c₁ < 0时)
∴ T(n)= O(n²)
T(n)≥ c₂(n-1)² + Θ(n)
= c₂n² -2c₂n +c₂ +Θ(n)
≥ c₂n² (Θ(n)-2c₂n+c₂ > 0时)
∴ T(n)= Ω(n²)
∴ T(n)= Θ(n²)
7.2-2
当数组中元素相同时,也就循环每次都会执行,即 0 : n-1划分,所以 T(n) = T(0) + T(n-1) + Θ(n)
所以 T(n) = Θ(n²)
7.2-3
当数组已经是降序排序排列,那么也就是快速排序的最坏情况,每次的划分都是 0 : n-1
所以 T(n) = Θ(n²)
7.2-4
因为用户使用多张支票是连号的,所以在一个时间段内,顶多是这几张支票打乱了顺序。而不是一天24小时之内所有的支票全部乱序,所以近似为有序的,那么这是快排的最坏情况,这时候插入排序的时间复杂度是O(n),而快速排序的时间复杂度是O(n²)
7.2-5
最短深度 α^M * n = 1 ∴ M = ㏒ α (n^-1) = - lg n/lg α
最大深度 (1-α)^M * n = 1 ∴ M = ㏒ 1-α (n^-1) = - lg n/lg (1-α)
7.2-6
在 nα 到 n(1-α)之间有 n - 2nα个数
∴ 概率 为 (n - 2nα)/n = 1-2α (在n个数中选择这n-2nα个数的概率)
7.3-1
讨论随机快速排序的最坏情况没有意义,随机只是降低了最坏情况的概率
7.3-2
都为Θ(n),每次调用RANDOM方法获得一个主元,每个主元都只被选择一次,不再后来被用到,所以最多调用RANDOM n-1次
7.4-1
T(n) = max (0≤q≤n-1) ( T(q) + T(n-q-1)+ Θ(n))
≥ max (0≤q≤n-1)(cq² + c(n-q-1)² + Θ(n))
= cmax (0≤q≤n-1) (2q² + (2-2n)q + (n-1)² + Θ(n))
∵ -b/2a = (1-n)/2
∴ 当q = 0或n-1时等式最大
∴ T(n)≥ c ((n-1)² + Θ(n))
= c (n² - 2n +1 +Θ(n))
≥ cn² (- 2n +1 +Θ(n)≤0)
∴ T(n)=Ω(n²)
7.4-2
用代入法证明
7.4-3
在7.4-1中T(n)中的关于q的二次函数的对称轴为(1-n)/2,所以当q=0或q=n-1时最大