第二章 2.3 习题
2.3.1 如图
2.3.2
不使用哨兵,只要有一个数组被检测完那么就停止,那么循环结束的条件需要发生改变应为 ( i < L.length and j <R.length)具体代码如下。
private static void Merge3(int[] A, int p,int q,int r){
int n1 = q-p+1;
int n2 = r-q;
int[] L = new int[n1];
int[] R = new int[n2];
for (int i = 0; i < n1; i++) {
L[i] = A[p+i];
R[i] = A[q+i+1];
}
System.out.println("p:"+p+",q:"+q+",r:"+r);
System.out.println("A"+ Arrays.toString(A));
System.out.println("L"+Arrays.toString(L));
System.out.println("R"+Arrays.toString(R));
int i = 0;
int j = 0;
int k = p;
while (i < L.length && j < R.length) {
if (L[i] <= R[j]){
A[k++] = L[i++];
}else {
A[k++] = R[j++];
}
}
while(i < j) {
A[k++] = L[i++];
}
while(j < i) {
A[k++] = R[j++];
}
System.out.println("A"+ Arrays.toString(A));
System.out.println();
}
2.3.3
1.
n
=
2
,
T
(
n
)
=
2
∗
lg
2
=
2
2.
n
=
2
k
,
T
(
n
)
=
2
k
lg
2
k
3.
n
=
2
k
+
1
,
T
(
n
)
=
2
k
+
1
∗
lg
2
k
+
1
=
2
k
+
1
∗
lg
2
k
+
l
g
2
)
=
2
∗
2
k
∗
l
g
2
k
+
2
k
+
1
lg
2
=
2
∗
T
(
2
k
)
+
2
k
+
1
=
2
T
(
n
/
2
)
+
n
1.n = 2, T(n) = 2* \lg 2 = 2 \\ 2. n = 2^{k},T(n) = 2^{k}\lg 2^{k}\\ 3. n = 2^{k+1}, T(n) = 2^{k+1}*\lg2^{k+1}=2^{k+1}*\lg2^{k}+lg2)\\ =2*2^{k}*lg2^{k}+2^{k+1}\lg2\\ =2*T(2^{k})+2^{k+1}=2T(n/2)+n
1.n=2,T(n)=2∗lg2=22.n=2k,T(n)=2klg2k3.n=2k+1,T(n)=2k+1∗lg2k+1=2k+1∗lg2k+lg2)=2∗2k∗lg2k+2k+1lg2=2∗T(2k)+2k+1=2T(n/2)+n
2.3.4
public static void selection_sort2(int[]A, int k){
if (k == A.length)
System.out.println(Arrays.toString(A));
else {
int i = k - 1;
int key = A[k];
while (i >= 0 && A[i] > key) {
A[i + 1] = A[i];
i--;
}
A[i + 1] = key;
selection_sort2(A, k + 1);
}
}