Actualmente estoy aprendiendo algoritmos en mi tiempo libre, pero tengo la siguiente pregunta al estudiar algoritmos de selección de capítulo 3().¿Comprende un algoritmo de selección mediano?
Entiendo que puedo usar el algoritmo select() para encontrar el número mediano (n/2º número más pequeño) si estaba usando una matriz de A a n números.
1) pero esta es la parte que estoy luchando por comprender. A = [3, 7, 5, 1, 4, 2, 6, 2]. supongamos que es la matriz. cuál es el contenido de la matriz después de cada llamada a Partition(), y los parámetros en cada llamada recursiva de Select().
¿alguien puede explicar cómo están resolviendo esto, por favor?
a continuación es el pseudocódigo para los 2 algoritmos.
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)
}
y el segundo código es
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
}
El libro que estoy usando se llama la derivación de Algoritmos por Anne Kaldewaij.
gracias por eso, acabo de leerlo y es más fácil de entender que el libro. Sin embargo, tengo una pregunta más: si A está en orden inverso, es decir, A = [n, n-1, ..., 2, 1], ¿cuántas llamadas recursivas se realizarán a Select()? –
Voy a dejar esto como un ejercicio^_ ^, pero como una sugerencia, tenga en cuenta que el algoritmo está eligiendo el primer elemento de la matriz como el pivote cada vez. ¿Dónde va a mover esto el pivote? ¿En qué orden van a terminar el resto de los elementos? También como sugerencia, piense en lo que podría hacer la ordenación rápida aquí. – templatetypedef
Primera frase del punto n. ° 3, creo que te refieres a que "el pivote está en la posición __ más pequeña__ que la k". – Blastfurnace