Está en la página 1de 13

1

TEMA 7: ALGORITMOS DE BÚSQUEDA


Y ORDENACIÓN
Autor: Luis Javier Herrera Maldonado
José Luis Bernier Villamor

Contenido:
1. Algoritmos de búsqueda
2. Algoritmos de ordenación
1.- Algoritmos de búsqueda 2

• Es muy frecuente realizar algún tipo de búsqueda o de


ordenación en cualquier programa.
• El 25% de los procesos informáticos implican alguna
búsqueda/ordenación de información.
• La característica principal de estos problemas es la rapidez.
• Al buscar un elemento en un vector, el tiempo requerido es
del orden de O(n) => el tiempo necesario para buscar 1
elemento aumenta con el número de elementos (t ~ n)
• Sin embargo, si éste está ordenado, el tiempo requerido es
de O(log2(n) => el tiempo invertido en buscar un elemento
log2(n) → mucho más eficiente!
• El orden de complejidad O(.) de un algoritmo es una medida
de su eficiencia: indica el número máximo de pasos o
iteraciones que ejecuta un algoritmo.
1.- Algoritmos de búsqueda 3

Ejemplo: buscar un elemento en un vector de n elementos


utilizando:
– Algoritmo A : complejidad O(n)
– Algoritmo B : complejidad O(log(n))
Se asume que en cada iteración del algoritmo se invierte 1
microsegundo.

n A: t ~ n *10-6 B: t ~ log (n) *10-6


2
1.000 0.001 segundo 0.00001 segundos
1.000.000 1 segundo 0.00002 segundos
100.000.000 100 segundos 0.000027 segundos
1.- Algoritmos de búsqueda 4

Búsqueda lineal

• Es el algoritmo más genérico y siempre se puede aplicar.


– Consiste en recorrer todo el espacio de búsqueda comparando
cada elemento del vector con el valor que se busca.
• El proceso finaliza cuando:
– Se encuentre el elemento
– Se haya recorrido todo el espacio de búsqueda sin encontrarlo.
1.- Algoritmos de búsqueda. Búsqueda lineal 5

function pos = busquedaLineal(Vector,elemento)

%Suponemos que el elemento no está y vamos a buscar si sí


encontrado = false;
i = 1;
while((~encontrado) && (i <= length(Vector)))
if(Vector(i) == elemento)
encontrado = true;
else
i = i+1;
end
end
if (encontrado)
pos = i;
else
pos = -1;
end

end
1.- Algoritmos de búsqueda 6

Búsqueda binaria

• Sólo se puede aplicar cuando el espacio de búsqueda


está ordenado.

• Es mucho más eficiente que el anterior.

• Se basa en:
– Comparar el valor buscado con el elemento central
– Dependiendo del resultado de la comparación se descarta la
mitad superior o la mitad inferior del espacio de búsqueda
– El proceso acaba al encontrar el elemento o al descartar el
espacio de búsqueda sin haberlo localizado.
1.- Algoritmos de búsqueda. Búsqueda binaria 7

function pos = busquedaBinaria(Vector,elemento)

%Suponemos que el elemento no está y vamos a buscar si sí


encontrado = false;
izda=1;
dcha=length(Vector);
while((~encontrado) && (izda<=dcha))
centro = round((izda+dcha)/2);
if (Vector(centro) == elemento)
encontrado=true;
elseif(Vector(centro) > elemento)
dcha=centro-1;
else
izda=centro+1;
end
end
if encontrado.....%completar
end
1.- Algoritmos de búsqueda. Búsqueda binaria 8

 La búsqueda binaria tiene una eficiencia O(log2(n))

 Es mucho más eficiente que la búsqueda lineal

 Si los datos no están ordenados => búsqueda lineal

 Si los datos están ordenados => búsqueda binaria

 Muchos problemas se pueden formular como una


búsqueda, por ejemplo, muchos algoritmos
matemáticos o algoritmos para la resolución de juegos
se resuelven como búsquedas de una solución.
2.- Algoritmos de ordenación 9

* Tenemos un vector desordenado y queremos ordenarlo


• La ordenación es más costosa que la búsqueda
• La ordenación exige intercambiar elementos del vector

• Los algoritmos de ordenación menos eficientes tienen


complejidad O(n2)
=> el tiempo necesario para ordenar n elementos aumenta con el
cuadrado de dicho número: (t ~ n2)
• Los mejores algoritmos de ordenación presentan una
complejidad O(nlog2(n))
=> el tiempo invertido en la ordenación de n elementos es
proporcional a nlog (n)
2
2.- Algoritmos de ordenación 10

 Ejemplo: ordenar un vector de n elementos


utilizando:
 Algoritmo A : complejidad O(n2)
 Algoritmo B : complejidad O(nlog(n))
 Se asume que en cada iteración del algoritmo se
invierte 1 microsegundo.

n A: t ~ n2 *10-6 B: t ~ nlog (n) *10-6


2
1.000 1 segundo 0.003 segundos
10.000 1min 40 seg 0.04 segundos
100.000 2.77 horas 0.5 segundos
1.000.000 11.57 días 6 segundos
10.000.000 3.17 años 1.16 minutos
2.- Algoritmos de ordenación 11

Ordenación por selección


• La ordenación por selección es muy intuitiva

• El proceso es el siguiente:
– Buscar el valor mínimo y colocarlo en la primera posición
– Buscar el siguiente mínimo y colocarlo en segunda posición
– Buscar el siguiente mínimo y colocarlo el tercero
– …..

• Este algoritmo es de orden O(n2)


2.- Algoritmos de ordenación. Por selección 12

function Vector = ordenaSeleccion(Vector)

%ordenamos el vector
for i = 1:length(Vector)-1
posmin = i;
for j = i+1:length(Vector)
if (Vector(j) < Vector(posmin))
posmin = j;
end
end
aux = Vector(i);
Vector(i) = Vector(posmin);
Vector(posmin) = aux;
end
end
2.- Algoritmos de ordenación. 13

* Existen algoritmos de ordenación mejores, O(nlog(n))

* El mejor algoritmo de ordenación conocido es un algoritmo


recursivo llamado QuickSort, que no vamos a estudiar,
aunque no es difícil de programar en absoluto

* Recordar que en MATLAB, la ordenación se realiza


fácilmente con la función sort

También podría gustarte