Professional Documents
Culture Documents
Captulo 7.
1.
Mtodos de bsqueda y
ordenamiento.
Dos de los problemas mas comunes en programacin, son los de bsqueda y ordenamiento. Son tan frecuentes, que existen varios mtodos
para implementarlos.
Esta ecuacin nos expresa el tiempo de ejecucin. Como en general es complejo evaluar la constante, esta no se evala y solo nos
concentramos en f(n).
Existen 3 tiempos que se pueden considerar al evaluar el tiempo de ejecucin:
El tiempo del mejor caso.
El tiempo del caso promedio.
El tiempo del peor caso.
El primer tiempo se refiere a que se supone que todo es ideal. Por ejemplo si vamos a ordenar los datos de entrada, estos ya estn ordenados. El
segundo caso se refiere al caso que con mayor frecuencia se presente. Por ejemplo en el caso de ordenamiento que los datos estn
desordenados. El ultimo tiempo considera que lo peor puede ocurrir. Por ejemplo en el ordenamiento que los datos estn ordenados al revs de
como los deseamos. Usualmente son mas significativos los tiempos del peor caso y el tiempo promedio.
El tiempo del peor caso se denota usualmente como O(f(n)) y se lee como o mayscula de f(n) u orden del mtodo. El tiempo del mejor caso
y se como omega mayscula. Esta obviamente no es uy til. El tiempo del caso promedio simplemente lo
se denota como
denotaremos por T(n)=f(n).
Cuando comparemos algoritmos nos concentraremos en los ordenes, y cuando sea prudente en el tiempo del caso promedio.
La funcin f(n) puede ser de varios tipos, algunos frecuentes son:
f(n)=1. Constante.
Captulo 7.
f(n)=n. Lineal.
f(n)=n 2 . Cuadrtico.
f(n)=n m . Polinomial de grado m.
f(n)=log n. Logartmico.
f(n)=n log n.
f(n)=2 n . Exponencial de base 2.
f(n)=mn . Exponencial de base m.
El mejor algoritmo ser aquel cuyo tiempo de ejecucin crezca mas lentamente. De las funciones anteriores los mejores son: constante,
logartmicos, polinomial de grado m. Las peores son: exponencial de base m, polinomial de grado m.
1. Mtodos de bsqueda
La bsqueda de informacin es una tarea rutinaria. La informacin puede estar almacenada ya sea en memoria principal o en secundaria. El
problema consiste en hallar un registro particular de entre todos los existentes. Nos restringiremos por simplicidad solo al caso de que la
informacin se halle en memoria principal. En este caso la informacin la almacenaremos en un arreglo.
El buscar un elemento especifico de un arreglo es una tarea comn. El problema puede plantearse de 2 maneras:
Saber si un elemento particular esta o no en el arreglo.
Conocer la posicion del elemento de inters en el arreglo.
El segundo planteamiento es de mayor aplicacin y es el que seguiremos. En este caso si el elemento no esta nuestros algoritmos deben de
indicarlo regresando una posicion invalida. Los algoritmos pueden implementarse ya sea con arreglos propiamente dicho o con apuntadores.
En el primer caso si el elemento que buscamos no se halla, el algoritmo regresara -1. Para el caso de apuntadores regresaremos el apuntador
NULL.
Para realizar la bsqueda tenemos 2 casos:
Arreglo desordenado.
Arreglo ordenado.
Para el primer caso el nico algoritmo disponible ser el de bsqueda secuencial. Para el segundo caso consideraremos el mtodo de bsqueda
binaria.
1. Bsqueda secuencial
La bsqueda lineal o secuencial es la tcnica ms simple para buscar en un arreglo de datos. Este mtodo consiste en examinar todos los
elementos de uno en uno, comenzando por el primer elemento del arreglo y comparando con el elemento buscado. El algoritmo prosigue hasta
hallarlo o llegar al final del arreglo. Consideraremos que se dispone de un vector x de n elementos y deseamos saber si el elemento e se
encuentra en el vector y en caso afirmativo deducir la posicin del mismo en el vector. Con el fin de escribir el cdigo lo mas general posible
consideraremos lo siguiente:
El tipo del arreglo lo definiremos con typedef denominndole tipo.
La comparacin de los datos la haremos va un apuntador a funcin.
El elemento NULO lo definiremos con una macro.
La posicin se representara con una variable POSICIN, que recibir el valor de la variable ndice del ciclo.
#define NULO -1
typedef |_| tipo;
int Bussec(tipo * x, int n, tipo e, int (* compara)(tipo, tipo))
{
int posicion=NULO;
for( i = 0; i< n; ++i)
if(!(* compara)(x[ i ],e)
Captulo 7.
posicion = i;
return (posicion);
}
El apuntador a funcin compara recibe la funcin usada para comparar los datos. La comparacin de datos depende fuertemente del tipo. Se
requiere escribir una funcin que compare los datos tomando en cuenta su tipo. Esta funcin debe de funcionar igual que strcmp, es decir,
regresa 0 si son iguales, un positivo si el primer parmetro es mayor al segundo o un negativo en caso contrario.
El procedimiento de bsqueda lineal se puede hacer un poco ms efectivo deteniendo el proceso una vez que se encuentre el elemento que se
est buscando. Para realizar este nuevo algoritmo es necesario sustituir el ciclo for con un ciclo while o do while que nos permita salir del ciclo
una vez que el dato ha sido encontrado.
Una bsqueda lineal es slo adecuada para arreglos cortos de datos.
El orden de este algoritmo es:
es decir, este algoritmo es de orden lineal. El tiempo de bsqueda es directamente proporcional al numero de datos.
En el caso promedio tenemos:
Un mtodo muy eficaz para buscar un elemento en una lista ordenada se denomina bsqueda binaria y se basa en el algoritmo de divisiones
sucesivas en mitades del diccionario comentado anteriormente.
1. Bsqueda binaria
El mtodo de bsqueda binaria utiliza el sistema de "divide y vencers" para localizar el elemento deseado. Supongamos un vector ordenado
de elementos numricos
x[ 0 ] , x[ 1 ] ,...., x [ n-1]
1. Verificar si e < x[0] o bien e > x [n-1]. En este caso se ha terminado la bsqueda ya que el estar ordenado el vector x, se supone que e
no existe en el vector.
Captulo 7.
2. Si e no cumple las condiciones anteriores, entonces e se encuentra en el vector y se calcula el elemento central de x, que se supone x[k]
x[ 0 ] , x[ 1 ] ,..., x[k],...,x [ n-1]
x[k]: elemento central
En ambos casos se ha dividido por dos la cantidad de datos donde se debe buscar.
1. En las listas compuestas por los subvectores se debern repetir de nuevo los pasos 1, 2, 3 y 4 hasta obtener un elemento x[i]=e, o
concluir que el elemento no esta.
Este mtodo se denomina bsqueda binaria debido a que se divide por dos el rango de la bsqueda. Mientras que en la bsqueda lineal se
necesitan en el caso promedio ( n + 1 ) / 2 comparaciones, la bsqueda binaria emplea alrededor de log n comparaciones. Si n = 1000, n/2 =
500, mientras que log 2 1000 = 10. Escribiremos una funcin de bsqueda binaria que permita localizar un valor especificado en un arreglo y
que devuelva el subndice del arreglo cuando se encuentra el valor. Si el valor no est almacenado en el arreglo se devolver -1.
int BusquedaBin (tipo * x, int n, tipo e, int (* compara)(tipo, tipo))
{
int primero=0, ultimo=n-1, central=(primero+ultimo)/2;
while(primero < = ultimo) {
if(!(* compara)(x[ central,e))
return (central);
else if((* compara)(x[ central,e)>0)
ultimo = central-1;
else
primero = central +1;
central=(primero+ultimo)/2;
}
return NULO;
Captulo 7.
1. Algoritmos de ordenamiento
El ordenamiento es una parte importante del manejo de informacin. Como ya mencionamos en los algoritmos de bsqueda, es mas eficiente
realizar bsquedas si el arreglo esta ordenado que si no. Existen muchos algoritmos para ordenar. Veremos solo algunos.
Captulo 7.
Captulo 7.
*H2O=*leche;
*leche=vaso;
}
El ndice quien nos indica a quien vamos a comparar y conquien nos indica con que elemento lo vamos a comparar.
La funcin intercambia realiza el intercambio de los valores, de los elementos del arreglo.
El orden y el tiempo del caso promedio de este mtodo es :
1. Ordenacin rpida
Posiblemente el algoritmo mas popular para el ordenamiento sea el de ordenacin rpida. La idea de este algoritmo es:
Elegir un elemento arbitrariamente. Este se denomina pivote.
Pasar los elementos mas grandes que el pivote que estn a su izquierda, a su derecha.
Pasar los elementos mas chicos que el pivote que estn a su derecha, a su izquierda.
Dividir el arreglo en 2. Una parte del primer elemento hasta el pivote, y la otra el resto.
Repetir los pasos anteriores con cada mitad.
Por ejemplo, con la siguiente lista:
18 11 27 14 9 4 16
18 11 27 14 9 4 16
Busquemos el primer elemento mas grande a la izquierda del pivote, en este caso 18. Luego el ultimo mas chico a la derecha del pivote, en
este caso 4. Intercambindolos tenemos:
4 11 27 14 9 18 16
Captulo 7.
Busquemos el segundo elemento mas grande a la izquierda del pivote, en este caso 27. Luego el penltimo mas chico a la derecha del pivote,
en este caso 9. Intercambindolos tenemos:
4 11 9 14 27 18 16
Ninguna de las sublistas esta ordenada, pero al ser mas corta la ordenacin ser mas rpida. Repitiendo el procedimiento con la primera
sublista tenemos:
4 11 9 14
4 11 9 14
Buscando el primer elemento mas grande a 9 tenemos el 11, pero como no hay otro elemento mas pequeo intercambiamos el pivote con el
11. Tenemos:
4 9 11 14
27 18 16
Captulo 7.
16 18 27
4 9 11 14 16 18 27
Captulo 7.
Este tiempo es mejor que en los dems algoritmos. Por eso este algoritmo es mejor. Sin embargo en el peor caso el orden es:
Por lo regular esto no es un problema, ya que en la practica lo que ocurre con mayor frecuencia es el caso promedio.
1. ndice
7. Mtodos de bsqueda y ordenamiento. 7-17.1 Orden del mtodo 7-17.2 Mtodos de bsqueda 7-37.2.1 Bsqueda
secuencial 7-47.2.2 Bsqueda binaria 7-57.3 Algoritmos de ordenamiento 7-77.3.1 Ordenamiento por insercin 777.3.2 Ordenamiento por burbuja o intercambio 7-87.3.3 Ordenacin rpida 7-97.4 Autoevaluacin 7-137.5 ndice
7-16