Vous êtes sur la page 1sur 6

Algoritmo de Bsqueda Binaria

Un algoritmo de bsqueda binaria (o corte binario) es una funcin para buscar un valor particular en un arreglo ordenado.
Eliminando la mitad de los datos en cada paso. La bsqueda binaria encuentra la media, compara y determina si el valor se
encuentra en esa posicin o esta antes o despus. Una Bsqueda Binaria es un ejemplo de la tcnica Divide y Conquista (o
mejor dicho Decrece y Conquista).
Algoritmo Iterativo
int bsqueda_binaria(vector <int> list, int val){
int der = list.size() - 1, izq = 0, m;
while(izq <= der){
m = (izq + der) / 2;
if(m == list[val]) return m; //la posicin del valor
if(m > list[val]) der = m 1;
else izq = m + 1;
}
return -1; // no se encontro el dato :P
}

Algoritmo Recursivo
// en este algoritmo se llema la funcion como sigue
// pos = bb_rec(list, 0, list.size() - 1);
int bb_rec(vector <int> list, int izq, int der int val){
int m = (izq + der) / 2;
if(izq > der) return -1; // no se encontro
if(list[m] == val) return m;
if(list[m] < val) return bb_rec(list, m + 1, der, val);
return bb_rec(list, izq, m 1 , val);
}
Por ejemplo: si se quiere buscar el 10 en el siguiente arreglo:
3

10

15

21

50

100

1564

1565

100000

50

100

1564

1565

100000

Paso 1: La bsqueda binaria busca la mitad:


3

10

15

21

Si es el resultado devuelve su posicin, en otro caso busca de que lado esta el valor, y desecha la mitad del arreglo
Paso 2: busca la mitad.
3

10

15

Si es el resultado devuelve su posicin, en otro caso busca de que lado esta el valor, y desecha la mitad del arreglo

Paso 3: busca la mitad.


10

15

Como se encontr el resultado, se regresa su posicin que es la 3.


La complejidad de la bsqueda binaria de O( log2 n ).
Por ejemplo si se quiere buscar un numero en un arreglo de 1,000,000 de nmeros, la bsqueda binaria solo requerir 20
pasos para encontrar el valor o determinar que no existe en el arreglo.
Nota: Recordemos que el arreglo debe estar ordenado para poder aplicar este algoritmo.

Extensin de Bsqueda binaria.


La bsqueda binaria no tan solo nos sirve para encontrar un nmero en un arreglo ordenado, si no tambin para
determinar, soluciones a problemas que su respuestas van creciendo.
Por ejemplo con una bsqueda binaria podramos saber cual es el valor que debe tener x, para que y = 2x sea igual a 1.3,

solamente modificando alguna parte del cdigo.

Ordenamiento Burbuja (Bubblesort)


^

1. Descripcin.
^

Este es el algoritmo ms sencillo probablemente. Ideal para empezar. Consiste en ciclar repetidamente a
travs de la lista, comparando elementos adyacentes de dos en dos. Si un elemento es mayor que el que est en
la siguiente posicin se intercambian. Sencillo no?

2. Pseudocdigo en C.
^

Tabla de variables
Nombre

Tipo

Uso

lista

Cualquiera

Lista a ordenar

TAM

Constante entera

Tamao de la lista

Entero

Contador

Entero

Contador

temp

El mismo que los elementos de la lista

Para realizar los intercambios

1. for (i=1; i<TAM; i++)


2.
for j=0 ; j<TAM - 1; j++)
3.
if (lista[j] > lista[j+1])
4.
temp = lista[j];
5.
lista[j] = lista[j+1];
6.
lista[j+1] = temp;

3. Un ejemplo
^

Vamos a ver un ejemplo. Esta es nuestra lista:


4-3-5-2-1

Tenemos 5 elementos. Es decir, TAM toma el valor 5. Comenzamos comparando el primero con el segundo
elemento. 4 es mayor que 3, as que intercambiamos. Ahora tenemos:
3-4-5-2-1
Ahora comparamos el segundo con el tercero: 4 es menor que 5, as que no hacemos nada. Continuamos con el
tercero y el cuarto: 5 es mayor que 2. Intercambiamos y obtenemos:
3-4-2-5-1
Comparamos el cuarto y el quinto: 5 es mayor que 1. Intercambiamos nuevamente:
3-4-2-1-5
Repitiendo este proceso vamos obteniendo los siguientes resultados:
3-2-1-4-5
2-1-3-4-5
1-2-3-4-5

4. Optimizando.
^

Se pueden realizar algunos cambios en este algoritmo que pueden mejorar su rendimiento.

Si observas bien, te dars cuenta que en cada pasada a travs de la lista un elemento va
quedando en su posicin final. Si no te queda claro mira el ejemplo de arriba. En la primera
pasada el 5 (elemento mayor) qued en la ltima posicin, en la segunda el 4 (el segundo mayor
elemento) qued en la penltima posicin. Podemos evitar hacer comparaciones innecesarias si
disminuimos el nmero de stas en cada pasada. Tan slo hay que cambiar el ciclo interno de esta
manera:
for (j=0; j<TAM - i; j++)

Puede ser que los datos queden ordenados antes de completar el ciclo externo. Podemos
modificar el algoritmo para que verifique si se han realizado intercambios. Si no se han hecho
entonces terminamos con la ejecucin, pues eso significa que los datos ya estn ordenados. Te dejo
como tarea que modifiques el algoritmo para hacer esto :-).

Otra forma es ir guardando la ltima posicin en que se hizo un intercambio, y en la siguiente


pasada slo comparar hasta antes de esa posicin.

5. Anlisis del algoritmo.


^

ste es el anlisis para la versin no optimizada del algoritmo:

Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto
es estable.
Requerimientos de Memoria: Este algoritmo slo requiere de una variable adicional para
realizar los intercambios.
Tiempo de Ejecucin: El ciclo interno se ejecuta n veces para una lista de n elementos. El ciclo
externo tambin se ejecuta n veces. Es decir, la complejidad es n * n = O(n ). El comportamiento
2

del caso promedio depende del orden de entrada de los datos, pero es slo un poco mejor que el
del peor caso, y sigue siendo O(n ).
2

Ventajas:

Fcil implementacin.

No requiere memoria adicional.

Desventajas:

Muy lento.

Realiza numerosas comparaciones.

Realiza numerosos intercambios.

Este algoritmo es uno de los ms pobres en rendimiento. Si miras la demostracin te dars cuenta de ello. No
es recomendable usarlo. Tan slo est aqu para que lo conozcas, y porque su sencillez lo hace bueno para
empezar. Ya veremos otros mucho mejores. Ahora te recomiendo que hagas un programa y lo pruebes. Si
tienes dudas mira el programa de ejemplo.

Merge Sort es un algoritmo recursivo para ordenar los elementos de un vector.


Primero se divide el vector en dos partes iguales.
Despus se ordenan las dos partes recursivamente.
Finalmente se combinan las dos partes ordenadas para obtener el resultado.

MERGESORT
Este algoritmo fue desarrollado por el matemtico hngaro John Von Neumann en 1945.
[Thomas Cormen, 2001].
Consiste en dividir en dos partes iguales el vector a ordenar, ordenar por separado cada una de las partes, y
luego mezclar ambas partes, manteniendo el orden, en un solo vector ordenado.
El algoritmo MergeSort (u Ordenamiento por mezcla) es un algoritmo que sirve para ordenar secuencias de
datos.
Utiliza los siguientes tres pasos:
DIVIDIR: divide la secuencia de "n" elementos a ordenar en dos subsecuencias de "n/2" elementos cada una.
VENCER: ordena las dos subsecuencias de manera recursiva mediante el algoritmo MERGESORT.
COMBINAR: combina las dos subsecuencias ordenadas para generar la solucin.
ANLISIS
CoMo cualquiera de los algoritmos de ordenamiento recursivo tiene complejidad logartmica: O(n log 2n).
Si el tiempo de ordenamiento de MergeSort para una lista de n elementos es T(n) entonces la repeticin T(n)
= 2T( n/2 ) + n sigue de la definicin del algoritmo (Aplicar el algoritmo a las dos listas de la mitad del
tamao de la lista original y aumentar los n pasos tomados para utilizar MergeSort en las dos listas
resultantes).
CARACTERISTICAS:

La eficiencia de este algoritmo es bastante notable en tiempo de ejecucin en comparacin con otros, ya que
su manera de trabajo por grupos pequeos agiliza la organizacin de los datos.
Su utilizacin se da con mucha frecuencia cuando la cantidad de registros no es muy grande ya que para
hacer las mezclas ste mtodo utiliza el doble del espacio que gasta el arreglo original de valores.
Este es un algoritmo estable (no intercambia los registros con claves iguales) dependiendo de la forma en que
se implemente, recursivo y por tanto de complejidad O(n log2n) tanto en el peor caso como en el mejor o en
el caso promedio pues el tiempo que emplea no depende de la disposicin inicial de los datos
VENTAJAS
A diferencia de algunas versiones mejoradas del QuickSort, MergeSort es un mtodo estable de ordenamiento
mientras la operacin de mezcla (Merge) sea implementada correctamente.
Una gran ventaja del MergeSort es que su algoritmo tiene mucha estabilidad (se evitan los problemas de
intercambio de claves en la manipulacin de datos). En la gestin de Bases de Datos se utiliza comnmente
cuando la cantidad de registros en el ndice es relativamente baja, ya que en caso contrario es poco
productivo debido a que gasta el doble de espacio del que ocupan inicialmente los datos.
Este algoritmo es efectivo para conjuntos de datos que se puedan acceder secuencialmente como arreglos,
vectores y listas ligadas
DESVENTAJAS
Su principal desventaja radica en que est definido recursivamente y su implementacin no recursiva emplea
una pila, por lo que requiere un espacio adicional de memoria para almacenarla.
A los algoritmos que realizan el proceso de ordenamiento dentro del mismo vector se les denomina algoritmos
de ordenamiento "in-situ", el algoritmo de MergeSort no pertenece a esta familia ya que no utiliza el espacio
sobre el que estn almacenados los datos sino que para poder funcionar requiere de un espacio de memoria
adicional del tamao de los datos a ordenar en el cual se realicen las mezclas

Vous aimerez peut-être aussi