Metodo de Burbuja y Busqueda Binaria

download Metodo de Burbuja y Busqueda Binaria

of 7

Transcript of Metodo de Burbuja y Busqueda Binaria

INTRODUCCIN

Muchas actividades humanas requieren que en ellas las diferentes colecciones de elementos utilizados se coloquen en un orden especfico. Las oficinas de correo y las empresas de mensajera ordenan el correo y los paquetes por cdigos postales con el objeto de conseguir una entrega eficiente; los anuarios o listines telefnicos ordenan sus clientes por orden alfabtico de apellidos con el fin ltimo de encontrar fcilmente el nmero de telfono deseado; los estudiantes de una clase en la universidad se ordenan por sus apellidos o por los nmeros de expediente, etc. Por esta circunstancia una de las tareas que realizan ms frecuentemente las computadoras en el procesamiento de datos es la ordenacin.

El estudio de diferentes mtodos de ordenacin es una tarea intrnsecamente interesante desde un punto de vista terico y, naturalmente, prctico. El captulo estudia los algoritmos y tcnicas de ordenacin ms usuales y su implementacin en C. De igual modo se estudiar el anlisis de los algoritmos utilizados en diferentes mtodos de ordenacin con el objetivo de conseguir la mxima eficiencia en su uso real.

ORDENACIN POR BURBUJA

El mtodo de ordenacin por burbuja es el ms conocido y popular entre estudiantes y aprendicesde programacin, por su facilidad de comprensin y programacin; por el contrario, es el menos eficiente y por ello, normalmente, se aprende su tcnica pero no suele utilizarse.La tcnica utilizada se denomina ordenacin por burbuja u ordenacin por hundimiento debido a que los valores ms pequeos burbujean gradualmente (suben) hacia la cima o parte superior del array de modo similar a como suben las burbujas en el agua, mientras que los valores mayores se hunden en la parte inferior del array. La tcnica consiste en hacer varias pasadas a travs del array. En cada pasada, se comparan parejas sucesivas de elementos. Si una pareja est en orden creciente (o los valores son idnticos), se dejan los valores como estn. Si una pareja est en orden decreciente, sus valores se intercambian en el array.

Algoritmo de la burbujaEn el caso de un array (lista) con n elementos, la ordenacin por burbuja requiere hasta n 1 pasadas.Por cada pasada se comparan elementos adyacentes y se intercambian sus valores cuando el primer elemento es mayor que el segundo elemento. Al final de cada pasada, el elemento mayor ha burbujeado hasta la cima de la sublista actual. Por ejemplo, despus que la pasada 0 est completa, la cola de la lista A[n 1] est ordenada y el frente de la lista permanece desordenado. Las etapas del algoritmo son: En la pasada 0 se comparan elementos adyacentes: A[0],A[1]),(A[1],A[2]),(A[2],A[3]),...(A[n-2],A[n-1])Se realizan n 1 comparaciones, por cada pareja (A[i],A[i+1]) se intercambian los valores si A[i+1] < A[i]. Al final de la pasada, el elemento mayor de la lista est situado en A[n-1]. En la pasada 1 se realizan las mismas comparaciones e intercambios, terminando con el elemento segundo mayor valor en A[n-2]. El proceso termina con la pasada n 1, en la que el elemento ms pequeo se almacena en A[0].

El algoritmo tiene una mejora inmediata, el proceso de ordenacin puede terminar en la pasada n 1, o bien antes, si en una pasada no se produce intercambio alguno entre elementos del vector es porque ya est ordenado, entonces no es necesario ms pasadas.El ejemplo siguiente ilustra el funcionamiento del algoritmo de la burbuja con un array de 5 elementos (A = 50, 20, 40, 80, 30), donde se introduce una variable interruptor para detectar si se ha producido intercambio en la pasada.

En consecuencia, el algoritmo de ordenacin de burbuja mejorado contempla dos bucles anidados: el bucle externo controla la cantidad de pasadas (al principio de la primera pasada todava no se ha producido ningn intercambio, por tanto la variable interruptor se pone a valor falso (0); el bucle interno controla cada pasada individualmente y cuando se produce un intercambio, cambia el valor de interruptor a verdadero (1).El algoritmo terminar, bien cuando se termine la ltima pasada (n 1) o bien cuando el valor del interruptor sea falso (0), es decir, no se haya hecho ningn intercambio. La condicin para realizar una nueva pasada se define en la expresin lgica.

Anlisis del algoritmo de la burbujaCul es la eficiencia del algoritmo de ordenacin de la burbuja? Depender de la versin utilizada.En la versin ms simple se hacen n 1 pasadas y n 1 comparaciones en cada pasada. Por consiguiente, el nmero de comparaciones es (n 1) * (n 1) = n2 2n + 1, es decir, la complejidad es 0(n2).Si se tienen en cuenta las versiones mejoradas haciendo uso de las variables interruptor o indiceIntercambio, entonces se tendr una eficiencia diferente a cada algoritmo. En el mejor delos casos, la ordenacin de burbuja hace una sola pasada en el caso de una lista que ya est ordenadaen orden ascendente y por tanto su complejidad es 0(n). En el caso peor se requieren (n i 1)comparaciones y (n i 1) intercambios. La ordenacin completa requiere comparaciones.

y un nmero similar de intercambios. La complejidad para el caso peor es 0(n2) comparaciones y 0(n2) intercambios. De cualquier forma, el anlisis del caso general es complicado dado que alguna de las pasadas pueden no realizarse. Se podra sealar, entonces, que el nmero medio de pasadas k sea 0(n) y el nmero total de comparaciones es 0(n2).

En el mejor de los casos, la ordenacin por burbuja puede terminar en menos de n 1 pasadas pero requiere, normalmente, muchos ms intercambios que la ordenacin por seleccin y su prestacin media es mucho ms lenta, sobre todo cuando los arrays a ordenar son grandes.

Mtodo Burbuja MejoradoComo ya sabemos mediante el mtodo burbuja, dado un arreglo de n nmeros, se requiere de n-1 pasos para dejar el arreglo ordenado.Se puede observar que en el primer paso el primer elemento mayor queda en la primera posicin mayor (ltima si es que estamos ordenando de menor a mayor); en el segundo paso el segundo elemento mayor queda en la segunda posicin mayor (penltima); y as sucesivamente. Por esta razn el nmero de comparaciones, debera irse reduciendo en uno, en cada paso.Se puede observar adems, que en muchos caso se consigue tener ordenado el arreglo, en un nmero menor de pasos a n-1, por lo cual el resto de los pasos seran innecesarios.Considerando estos dos hechos se podra mejorar el mtodo burbuja eliminando los pasos innecesarios y reduciendo las comparaciones con cada paso.Una manera sencilla de hacer esto sera detectando mediante algn registro si se han efectuado cambios o no, y reduciendo el nmero de comparaciones en cada paso.

MTODO BURBUJA MEJORADOComo ya sabemos mediante el mtodo burbuja, dado un arreglo de n nmeros, se requiere de n-1 pasos para dejar el arreglo ordenado.Se puede observar que en el primer paso el primer elemento mayor queda en la primera posicin mayor (ltima si es que estamos ordenando de menor a mayor); en el segundo paso el segundo elemento mayor queda en la segunda posicin mayor (penltima); y as sucesivamente. Por esta razn el nmero de comparaciones, debera irse reduciendo en uno, en cada paso.Se puede observar adems, que en muchos caso se consigue tener ordenado el arreglo, en un nmero menor de pasos a n-1, por lo cual el resto de los pasos seran innecesarios.Considerando estos dos hechos se podra mejorar el mtodo burbuja eliminando los pasos innecesarios y reduciendo las comparaciones con cada paso.Una manera sencilla de hacer esto sera detectando mediante algn registro si se han efectuado cambios o no, y reduciendo el nmero de comparaciones en cada paso.A continuacin se muestra un fragmento de cdigo que permite realizar estas mejoras:

BSQUEDA EN LISTAS: BSQUEDAS SECUENCIAL Y BINARIA

Con mucha frecuencia los programadores trabajan con grandes cantidades de datos almacenados en arrays y registros, y por ello ser necesario determinar si un array contiene un valor que coincida con un cierto valor clave. El proceso de encontrar un elemento especfico de un array se denomina bsqueda. En esta seccin se examinarn dos tcnicas de bsqueda: bsqueda lineal o secuencial, la tcnica ms sencilla, y bsqueda binaria o dicotmica, la tcnica ms eficiente.

Bsqueda binaria

La bsqueda secuencial se aplica a cualquier lista. Si la lista est ordenada, la bsqueda binaria proporciona una tcnica de bsqueda mejorada. Una bsqueda binaria tpica es la bsqueda de una palabra en un diccionario. Dada la palabra, se abre el libro cerca del principio, del centro o del final dependiendo de la primera letra del primer apellido o de la palabra que busca. Se puede tener suerte y acertar con la pgina correcta; pero, normalmente, no ser as y se mueve el lector a la pgina anterior o posterior del libro. Por ejemplo, si la palabra comienza con J y se est en la L se mueve uno hacia atrs. El proceso contina hasta que se encuentra la pgina buscada o hasta que se descubre que la palabra no est en la lista.

Una idea similar se aplica en la bsqueda en una lista ordenada. Se sita la lectura en el centro de la lista y se comprueba si la clave coincide con el valor del elemento central. Si no se encuentra el valor de la clave, se sigue la bsqueda uno en la mitad inferior o superior del elemento central de la lista. En general, si los datos de la lista estn ordenados se puede utilizar esa informacin para acortar el tiempo de bsqueda.

Anlisis de los algoritmos de bsquedaAl igual que sucede con las operaciones de ordenacin cuando se realizan operaciones de bsqueda es preciso considerar la eficiencia (complejidad) de los algoritmos empleados en la bsqueda. El grado de eficiencia en una bsqueda ser vital cuando se trata de localizar una informacin en una lista o tabla en memoria, o bien en un archivo de datos.

Complejidad de la bsqueda secuencialLa complejidad de la bsqueda secuencial diferencia entre el comportamiento en el caso peor y mejor. El mejor caso se encuentra cuando aparece una coincidencia en el primer elemento de la lista y en ese caso el tiempo de ejecucin es O(1). El caso peor se produce cuando el elemento no est en la lista o se encuentra al final de la lista. Esto requiere buscar en todos los n trminos, lo que implica una complejidad de O(n).

El caso medio requiere un poco de razonamiento probabilista. Para el caso de una lista aleatoria es probable que una coincidencia ocurra en cualquier posicin. Despus de la ejecucin de un nmero grande de bsquedas, la posicin media para una coincidencia es el elemento central n/2. El elemento central ocurre despus de n/2 comparaciones, que define el coste esperado de la bsqueda.Por esta razn, se dice que la prestacin media de la bsqueda secuencial es O(n).

Anlisis de la bsqueda binariaEl caso mejor se presenta cuando una coincidencia se encuentra en el punto central de la lista. En este caso la complejidad es O(1) dado que slo se realiza una prueba de comparacin de igualdad.

La complejidad del caso peor es O(log2 n) que se produce cuando el elemento no est en la lista o el elemento se encuentra en la ltima comparacin. Se puede deducir intuitivamente esta complejidad. El caso peor se produce cuando se debe continuar la bsqueda y llegar a una sublista de longitud de 1. Cada iteracin que falla debe continuar disminuyendo la longitud de la sublista por un factor de 2. El tamao de las sublistas es:

La divisin de sublistas requiere m iteraciones, en cada iteracin el tamao de la sublista se reduce a la mitad. La sucesin de tamaos de las sublistas hasta una sublista de longitud 1:

V

siendo n/2m = 1.

Tomando logaritmos en base 2 en la expresin anterior quedar:

n = 2mm = log2 nPor esa razn la complejidad del caso peor es O(log2 n). Cada iteracin requiere una operacin de comparacin:Total comparaciones ] 1 + log2 n

Busqueda binariaEl hecho de que el vector este ordenado se puede aprovechar para conseguiruna mayor eficiencia en la busqueda planteando el siguiente algoritmo: compararelem con el elemento central; si elem es ese elemento ya hemos terminado, enotro caso buscamos en la mitad del vector que nos interese (segun sea elem menor o mayor que el elemento mitad, buscaremos en la primera o segunda mitad del vector, respectivamente). Posteriormente, si no se ha encontrado el elementorepetiremos este proceso comparando elem con el elemento central del subvectorseleccionado, y as sucesivamente hasta que o bien encontremos el valor elem obien podamos concluir que elem no esta (porque el subvector de busqueda esta