我目前在业余时间学习算法,但在学习第 3 章 select() 算法时有以下问题。
我知道如果我使用从 A 到 n 个数字的数组,我可以使用 select() 算法来查找中位数(第 n/2 个最小数字)。
1)但这是我难以理解的一点。A = [3, 7, 5, 1, 4, 2, 6, 2]。假设这是数组。每次调用 Partition() 后数组的内容是什么,以及每次递归调用 Select() 中的参数是什么。
有人可以解释一下他们是如何解决这个问题的吗?
下面是两种算法的伪代码。
Select(A, p, r, k) {
/* return k-th smallest number in A[p..r] */
if (p==r) return A[p] /* base case */
q := Partition(A,p,r)
len := q – p + 1
if (k == len) return A[q]
else if (k<len) return Select(A,p,q-1,k)
else return Select(A,q+1,r,k-len)
}
第二个代码是
Partition(A, p, r) { /* partition A[p..r] */
x := A[r] /* pivot */
i := p-1
for j := p to r-1 {
if (A[j] <= x) {
i++
swap(A[i], A[j])
}
}
swap(A[i+1], A[r])
return i+1
}
我正在使用的书是Anne Kaldewaij的《算法推导》 。