Análisis del algoritmo de la sacudida (burbuja mejorado)

Anuncio
Análisis del algoritmo de la sacudida (burbuja mejorado):
Sea el algoritmo (en java):
public void shakerSort ( int n, int a [] ) {
int k = n-1, L = 1, R = n-1;
do{
for(int j = R; j >= L; j—)
if (a[j-1] > a[j]) {
int x = a[j-1]; a[j-1] = a[j]; a[j] = x;
k = j;
}
L = k+1;
for(int j = L; j<=R;j++)
if (a[j-1] > a[j]) {
int x = a[j-1]; a[j-1] = a[j]; a[j] = x;
k = j;
}
R = k-1;
}while(L <= R);
}
Para el análisis de este algoritmo debemos determinar cual instancia representa el peor caso. Este
algoritmo ordena la lista de manera creciente, por lo que la instancia que representa el peor caso es
aquella que tiene el arreglo ordenado de manera decreciente.
Las variables L y R controlan el número de veces que se ejecutan los ciclos internos. En el peor caso L
aumenta de uno en uno y R disminuye de la misma manera. La condición de parada es LR , por lo
n
que, en el peor caso, L aumenta en uno hasta
y R disminuye hasta la misma posición (menos 1).
2
Con un poco de intuición y experiencia, podríamos habernos dado cuenta rápidamente que el primer
ciclo hace n-1,n-3,n-5 ... comparaciones para cada pasada, respectivamente. El segundo n-2,n-4,n-6...,
comparaciones para cada pasada, respectivamente; por lo que tenemos la suma
n−1n−2n−3... , entonces podríamos concluir directamente que:
n−1
cnn−1
2
i =1
Donde c es la constante que representa el costo de hacer una comparación entre claves
T  n=c ∑ n−i , cuya fórmula puede obtenerse fácilmente1: T  n=
Sin embargo, si se quiere hacer el mismo análisis, pero de manera separada (por ciclo) y detallada,
entonces podríamos proceder como sigue:
1 Vea guía de sumas
Para el primer ciclo, es fácil darse cuenta que, en la primera pasada, se realizan n−1 comparaciones
y al final k = j=1 , por lo que al salir del ciclo L=2 . Para el segundo ciclo, es fácil darse cuenta
que se realizan n−2 comparaciones (pues R=n−1 y L=2 ) y al final k = j=n−1 , por lo
que al salir del ciclo R=n−2 .
Estos resultados de la primera pasada hacen que para la segunda pasada del primer ciclo j varíe entre
L=2 y R=n−2 , por lo que se hacen n−3 comparaciones. Para el segundo ciclo j varía entre
L=3 y R=n−2 , por lo que se hacen n−4 comparaciones.
Así, para la tercera iteración, el primer ciclo hace n−5 comparaciones y el segundo n−6 . Esto
n
se repite
veces para cada ciclo. Por tanto, si c es la constante que representa el costo de hacer
2
una comparación entre claves, entonces:
⌊n/2⌋
T  n= ∑
i =1
∑
n−1
j=2i−1
n−1
c ∑ c
j=2i

⌊ n /2 ⌋
, que es: T  n=c ∑
n−1
∑
i=1 j=2i−1
⌊ n /2 ⌋ n−1
1c ∑
∑1
.
i=1 j=2i
Nótese que el primer término suma todos los valores impares hasta n−1 (ya que j llega a tomar el
n
valor de n−1 cuando i=
). Igualmente el segundo término suma todos los valores pares hasta
2
n
n−1 (ya que j=n cuando i= ). Entonces, lo que tenemos es una suma de todos los valores
2
desde 1 hasta n−1 , que es:
n−1
T  n=c ∑ i , cuya fórmula cerrada es: T  n=
i =1
cnn−1
2
Por tanto, en el peor de los casos T  n=On 2  .
Se deja como ejercicio calcular el mejor caso y el caso promedio.
Diego Mosquera, 20/05/2008
Descargar