Está en la página 1de 25

Introduccin

Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar. En este caso, nos servirn para ordenar vectores o matrices con valores asignados aleatoriamente. Nos centraremos en los mtodos mas populares, analizando la cantidad de comparaciones que suceden, el tiempo que demora y revisando el cdigo, escrito en Java, de cada algoritmo.

Mtodo Burbuja
El mtodo de la burbuja es uno de los mas simples, es tan fcil como comparar todos los elementos de una lista contra todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posicin. Se denomina burbuja 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.

Mtodo Burbuja Simple


La burbuja mas simple de todas es la que compara todos con todos, generando comparaciones extras, por ejemplo, no tiene sentido que se compare con sigo mismo o que se compare con los valores anteriores a el, ya que supuestamente, ya estn ordenados.

Por ejemplo, imaginemos que tenemos los siguientes valores:

Lo que hara una burbuja simple, seria comenzar recorriendo los valores de izq. A derecha, comenzando por el 5. Lo compara con el 6, con el 1, con el 0 y con el 3, si es mayor o menor (dependiendo si el orden es ascendiente o descendiente) se intercambian de posicin. Luego continua con el siguiente, con el 6, y lo compara con todos los elementos de la lista, esperando ver si se cumple o no la misma condicin que con el primer elemento. As, sucesivamente, hasta el ultimo elemento de la lista.

Burbuja Mejorada
Una nueva versin del mtodo de la burbuja seria limitando el numero de comparaciones, ya que es innecesario que se compare consigo misma. Si tenemos una lista de 10.000 elementos, entonces son 10.000 comparaciones que estn sobrando.

Imaginemos si tenemos 1.000.000 de elementos. El mtodo seria mucho mas optimo con n comparaciones menos (n = total de elementos).

Mtodo Burbuja Optimizada


Si al cambio anterior (el de la burbuja mejorada) le sumamos otro cambio, el hecho que los elementos que estn detrs del que se esta comparando, ya estn ordenados, las comparaciones serian aun

menos y el mtodo seria aun mas efectivo. Si tenemos una lista de 10 elementos y estamos analizando el quinto elemento, que sentido tiene que el quinto se compare con el primero, el segundo o el tercero, si supuestamente, ya estn ordenados.

Ejemplo:
Elementos (A = 50, 20, 40, 80, 30), donde se introduce una variable interruptor para detectar si se ha producido intercambio en la pasada. Pasada 0

50

20

40

80

30

Intercambio 50 y 20 Intercambio 50 y 40

20

50

40

80

30

20 20 20

40 40 40

50 50 50

80 80 30

30 30 80

50 y 80 ordenados
Intercambio 80 y 30

Elemento mayor es 80 interruptor = TRUE

Pasada 1
20 y 40 ordenados

20

40

50

30

80

20

40

50

30

80

40 y 50 ordenados

20

40

50

30

80

Se intercambian 50 y 30

20

40

30

50

80

50 y 80 elementos mayores y ordenados interruptor = TRUE

Pasada 2.- Solo se hacen dos comparaciones.

20

40

30

50

80

20 y 40 ordenados Se intercambian 40 y 30 interruptor = TRUE

20

30

40

50

80

Pasada 3.- Se hace una nica comparacin de 20 y 30, y no se produce


intercambio:

20

30

40

50

80

20 y 30 ordenados

20

30

40

50

80

Lista ordenada interruptor = FALSE

Mtodo Seleccin
Los mtodos de ordenacin por seleccin se basan en dos principios bsicos: Seleccionar el elemento ms pequeo (o ms grande) del arreglo. Colocarlo en la posicin ms baja (o ms alta) del arreglo. A diferencia del mtodo de la burbuja, en este mtodo el elemento ms pequeo (o ms grande) es el que se coloca en la posicin final que le corresponde. Consideremos un array A con 5 valores enteros 51, 21, 39, 80, 36

A[0] 51
Pasada 0

A[1] 21

A[2] 39

A[3] 80

A[4] 39
Pasada 0. Seleccionar 21 Intercambiar 21 y A[0]

21

51
Pasada 1

39

80

36

Pasada 1. Seleccionar 36 Intercambiar 36 y A[1]

21

36

39
Pasada 2

80

51

Pasada 2. Seleccionar 39 Intercambiar 39 y A[2] Pasada 3. Seleccionar 51 Intercambiar 51 y A[3] Lista ordenada

21

36

39

80
Pasada 3

51

21

36

39

51

80

Mtodo Insercin
El mtodo de ordenacin por insercin es similar al proceso tpico de ordenar tarjetas de nombres (cartas de una baraja) por orden alfabtico, que consiste en insertar un nombre en su posicin correcta dentro de una lista o archivo que ya est ordenado. As el proceso en el caso de la lista de enteros A = 50, 20, 40, 80, 30.

50
Procesar 20 Procesar 40 Procesar 80 Procesar 30

Se comienza por el 50

20 20 20

50 40 40 30

Se inserta 20 en la posicin 0 50 se mueve a posicin 1

50 50 40

Se inserta 40 en la posicin 1 Se mueve 50 a posicin 2

80

El elemento 80 est bien ordenado

20

50

80

Se inserta 30 en posicin 1 Se desplaza a la derecha la sublista derecha

Mtodo Intercambio
Se encarga de ordenar los elementos de una lista en orden ascendente. Este algoritmo se basa en la lectura sucesiva de la lista a ordenar, comparando el elemento inferior de la lista con los restantes y efectuando intercambio de posiciones cuando el orden resultante de la comparacin no sea el correcto.

Pasada 0
A[0] A[1] A[2] A[3]

Se realiza intercambio

4 4

8 8

6 6

2 2

No se realiza intercambio

Se realiza intercambio

Lista inicial

Lista resultante

Pasada 1 A[0] A[1]

A[2]

A[3]

Intercambio

Intercambio

Lista inicial

Lista resultante

Pasada 2 La sublista a considerar ahora es 8, 6 ya que 2, 4 est ordenada. Una comparacin nica se produce entre los dos elementos de la sublista

Intercambio

Lista inicial

Lista resultante

Mtodo Shell
El nombre se debe a su inventor, D. L. Shell. Se suele denominar tambin ordenacin por insercin con incrementos decrecientes. Se considera que el mtodo Shell es una mejora de los mtodos de insercin directa.
Shell modifica los saltos contiguos resultantes de las comparaciones por saltos de mayor tamao y con ello se consigue que la ordenacin sea ms rpida. Generalmente se toma como salto inicial n/2 (siendo n el nmero de elementos), luego se reduce el salto a la mitad en cada repeticin hasta que el salto es de tamao 1.

Ejemplo: 74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30 Se debe empezar con k=n/2 , siendo n el nmero de elementos de arreglo, y utilizando siempre la divisin entera.... despus iremos variando k hacindolo ms pequeo mediante sucesivas divisiones por 2, hasta llegar a k=1. Pero vamos a ello... En nuestro ejemplo, n=11 (porque hay 11 elementos). As que k=n/2=11/2=5 Empezamos con k=5. As pues, vamos a dividir nuestro arreglo original en 5 subarreglo, en los cuales, sus elementos estarn separados por 5 lugares del arreglo original (el salto o gap es 5). 1.- Tomamos el primer elemento (el 74) contamos 5 lugares y tomamos tambin otro elemento (el 97) volvemos a contar 5 y tomamos otro (el 30) y acabamos porque se nos acaba el arreglo. El primer sub-arreglo con k=5 es el formado por 74, 97 y 30. 74 , 14, 21, 44, 38, 97 , 11, 78, 65, 88, 30

Ahora, ordenaremos los elementos del sub-arreglo (rojo) pero slo entre ellos, utilizando el algoritmo de Insercin directa. 74, 97, 30 30 , 14, 21, 44, 38, 74 , 11, 78, 65, 88, 97 El 30, un elemento relativamente pequeo se ha ido hacia el principio y el 97 hacia el final. Formemos ahora otro sub-arreglo con salto k=5... partiendo del segundo elemento (el 14) y contando 5 (tomamos tambin el 11) y hasta ah, porque se acaba el arreglo. 30 , 14 , 21, 44, 38, 74 , 11 , 78, 65, 88, 97 Vamos a ordenarlos el 11 primero y el 14 despus. 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97

30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97

Ahora a por otro el 21 y el 78 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97 Estn en orden entre ellos, as que se quedan como estn.
Ahora le toca al sub-arreglo formado por el 44 y el 65 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97 Que tambin estn en orden entre ellos. y finalmente el 38 y el 88, que tambin estn en orden. 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97

An no hemos terminado de ordenarlos. Nuestra k vala 5, as que ahora kk/2=5/2=2, nuestra nueva k vale 2. Repetimos todo el desarrollo anterior, pero ahora nos saldrn 2 sub-arreglo cuyos elementos estn separados por 2 lugares. Tomamos el primer elemento (el 30) contamos 2 lugares y tomamos tambin otro elemento (el 21) volvemos a contar 2 y tomamos otro (el 38), volvemos a contar y ahora tomamos (el 14), seguimos contado y tomamos (el 65), seguimos contando y tomamos (el 97) y acabamos porque se nos acaba el arreglo. Y posteriormente se forma el segn sub-arreglo que empieza con el 11. 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97 Se ordena (primero los rojos), con el mtodo de insercin: 14 , 11 , 21, 44, 30, 74 , 38 , 78, 65, 88, 97 Finalmente ordenamos los negros, pero estos ya estn ordenados: 14 , 11 , 21, 44, 30, 74 , 38 , 78, 65, 88, 97

Finalmente, calculamos un nuevo k dividiendo el que tenemos entre 2. kk/2=2/2=1 Hemos llegado a k=1. Cuando k es 1 slo podemos obtener 1 sub-arreglo cuyos elementos estn separados 1 posicin: el propio arreglo original. Dicho de otra manera... cuando k es 1, el algoritmo de Shell se comporta exactamente igual que el de insercin directa sobre todo el arreglo.

14 , 11 , 21, 44, 30, 74 , 38 , 78, 65, 88, 97


El mtodo de insercin directa se comporta tanto mejor cuanto ms cerca est cada elemento de su sitio definitivo. Finalmente, el arreglo queda de sta manera:

11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97
Cada elemento descolocado ha tenido que moverse pocos lugares. Muchos de ellos ni siquiera se han movido.

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 Secuencial
Busca un elemento de una lista utilizando un valor destino llamado clave. En una bsqueda secuencial (a veces llamada bsqueda lineal), los elementos de una lista o vector se exploran (se examinan) en secuencia, uno despus de otro. La bsqueda secuencial es necesaria, por ejemplo, si se desea encontrar la persona cuyo nmero de telfono es 958-220000 en un directorio o listado telefnico de su ciudad.
Array

La bsqueda secuencial se utiliza normalmente cuando el array no est ordenado. Comienza en el principio del array y busca hasta que se encuentra el dato buscado y se llega al final de la lista.

Ejemplo:
public static int search(int[ ] arr, int valor) { int i = 0; while (i < arr.length && arr[i] != valor) { i++; } if(i< arr.length) return i+1 ; else return-1 }

Bsqueda Binaria
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.
Si un array est ordenado, se puede utilizar un algoritmo ms eficiente denominado bsqueda binaria.

Ejemplo de Bsquedas
Se tiene un arreglo ordenado de 19 casillas.

Si buscamos el nmero 107. En que posicin del arreglo se encuentra? Cuntas comparaciones se hacen?
Bsqueda Secuencial Posicin = 16 Comparaciones = 17 Bsqueda Binaria Posicin = 16 comparaciones = 3

En cul fue el nmero menor de comparaciones? Por qu?