私は現在、暇なときにアルゴリズムを学んでいますが、第3章のselect()アルゴリズムを研究しているときに、次の質問があります。
Aからnまでの数の配列を使用している場合、select()アルゴリズムを使用して中央値(n / 2番目に小さい数)を見つけることができることを理解しています。
1)しかし、これは私が理解するのに苦労しているビットです。A = [3、7、5、1、4、2、6、2]。それが配列だとします。Partition()の各呼び出し後の配列の内容、およびSelect()の各再帰呼び出しのパラメーターは何ですか。
誰かがこれをどのように解決しているか説明できますか?
以下は、2つのアルゴリズムの擬似コードです。
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)
}
2番目のコードは
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
}
私が使用している本は、AnneKaldewaijによるTheDerivationofAlgorithmsと呼ばれています。