Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Algoritmos Recursivos
Algoritmos Recursivos
Algoritmos Recursivos de
Búsqueda y Ordenación y sus
tiempos
1. Algoritmos de ordenación recursivos
1.1. Mergesort, Ordenamiento por fusión
Mergesort se ejecuta en un tiempo de O(nlogn) en el peor caso, donde n
es el tamaño del array a ordenar. La cantidad de comparaciones realizadas es
cerca de optima. Es un ejemplo bueno de algoritmo recursivo.
void sort por fusion(int A[], int B[], int izq, int der)
{
int centro;
void fusion(int A[], int B[], int izq, int centro, int der)
1
{
int final izq, nroelem, tmp;
2
Obtenemos la siguiente recurrencia:
T (1) = 1
T (n) = 2T (n/2) + n
resolvamos la recurrencia:
clave1=A[i];
for (k=i+1;k<=j;k++)
if (A[k]>clave1) return k;
else if (A[k]<clave1) return i;
3
return 0;
}
1. búsqueda: mover izq a la derecha mientras A[izq] sea menor que el pivote.
Mover der a la izquierda mientras A[der] sea mayor o igual al pivote.
2. testeo : si izq > der (que significa izq = der + 1) hemos particionado
exitosamente la entrada.
3. cambio : si izq < der intercambiar A[izq] con A[der]. Luego de hacer esto
A[izq] tiene una clave menor que el pivote y A[der] tiene una clave al
menos igual al pivote de modo que sabemos que en la siguiente búsqueda
izq se va a mover al menos una posición a la derecha y der se va a mover
al menos una posición a la izquierda.
izq=i;
der=j;
do
{
intercambio(A,izq,der);
while(A[izq] < pivote) izq++;
while(A[der] >= pivote) der- -;
}
while (izq <= der);
return izq;
}
4
el intercambio inicial no interesa ya que no asumimos ningún orden en la
entrada al comienzo del programa.
El programa final es el siguiente:
indice=hallo pivote(A,i,j);
if (indice! =0)
{
pivote=A[indice];
k=particion(A,i,j,pivote);
sort rapido(A,i,k-1);
sort rapido(A,k,j);
}
}
5
Luego en el peor caso quicksort toma un tiempo proporcional a n2 (ambos
O(n2 ) y Ω(n2 )).
2. Algoritmos de Búsqueda
2.1. Búsqueda lineal recursiva
La búsqueda lineal compara los elementos del array con la clave de búsque-
da hasta que encuentra el elemento o bien hasta que se determina que no se
encuentra.
luego
6
int busqueda binaria(int A[],int X, int i, int j)
{
int medio;
if (i>j) return 0;
medio = (i+j) / 2;
if (A[medio] < X) return busqueda binaria(A,X,medio+1,j)
else if (A[medio] > X) return busqueda binaria(A,X,i,medio-1)
else return medio;
}
T(n) = T(n/2) + 1
T(n/2) = T(n/4) + 1
..
.
T(2) = T(1) + 1
T(1) = 1
T(0) = 1