Metodos de ordenamiento

20
MÉTODOS DE ORDENAMIENTO ING. CÉSAR AUGUSTO GUTIÉRREZ RODRÍGUEZ

Transcript of Metodos de ordenamiento

Page 1: Metodos de ordenamiento

MÉTODOS DE ORDENAMIENTO

ING. CÉSAR AUGUSTO GUTIÉRREZ RODRÍGUEZ

Page 2: Metodos de ordenamiento

IntroducciónLos métodos de ordenamiento nos permiten, organizar la información contenida en vectores o matrices con valores asignados manual o aleatoriamente. Veremos los métodos mas utilizados, analizando la cantidad de comparaciones que suceden, el tiempo que demora y revisando el código, escrito en Java, de cada algoritmo.

Page 3: Metodos de ordenamiento

Método Burbuja

El método de la burbuja es uno de los mas simples, es tan fácil 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 posición.Se denomina burbuja debido a que los valores más pequeños «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.

Page 4: Metodos de ordenamiento

Método 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 están ordenados.

▪ Por ejemplo, imaginemos que tenemos los siguientes valores:

Lo que haría 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 posición. 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 condición que con el primer elemento. Así, sucesivamente, hasta el ultimo elemento de la lista.

5 6 1 0 3

Page 5: Metodos de ordenamiento

Estructura En JAVA

for (i=0; i<n; i++){   for (j=i+1; j<n; j++)  {    if(V[i]>V[j])    {     aux = V[i];     V[i] = V[j];     V[j] = aux;    }  }}

Page 6: Metodos de ordenamiento

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

20 50 40 80 30 Intercambio 50 y 40

20 40 50 80 30 50 y 80 ordenados

20 40 50 80 30 Intercambio 80 y 30

20 40 50 30 80Elemento mayor es 80interruptor = TRUE

Page 7: Metodos de ordenamiento

▪ Pasada 1

20 y 40 ordenados

40 y 50 ordenados

Se intercambian 50 y 30

• 50 y 80 elementos mayores y ordenados• interruptor = TRUE

20 40 50 30 80

20 40 50 30 80

20 40 50 30 80

20 40 30 50 80

Page 8: Metodos de ordenamiento

▪ Pasada 2.- Solo se hacen dos comparaciones.

Se intercambian 40 y 30interruptor = TRUE

20 y 40 ordenados20 40 30 50 80

20 30 40 50 80

Pasada 3.- Se hace una única comparación de 20 y 30, y no se produce intercambio:

20 30 40 50 80 20 y 30 ordenados

Lista ordenada interruptor = FALSE

20 30 40 50 80

Page 9: Metodos de ordenamiento

Método Selección

▪ Los métodos de ordenación por selección se basan en dos principios básicos:Seleccionar el elemento más pequeño (o más grande) del arreglo.Colocarlo en la posición más baja (o más alta) del arreglo.A diferencia del método de la burbuja, en este método el elemento más pequeño (o más grande) es el que se coloca en la posición final que le corresponde.

▪ Consideremos un array A con 5 valores enteros 51, 21, 39, 80, 36:

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

51 21 39 80 39 A[0] A[1] A[2] A[3] A[4]

Pasada 021 51 39 80 36

Pasada 1

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

Page 10: Metodos de ordenamiento

21 36 39 80 51

Pasada 2

Pasada 2. Seleccionar 39Intercambiar 39 y A[2]

21 36 39 80 51

Pasada 3

Pasada 3. Seleccionar 51Intercambiar 51 y A[3]

21 36 39 51 80 Lista ordenada

Page 11: Metodos de ordenamiento

Estructura en JAVA

▪ for (i=0; i<n; i++){  imin=i;  for (j=i+1; j<n; j++)  {    if(V[j]<V[imin])    imin=j;  }  aux = V[i];  V[i] = V[imin];  V[imin] = aux;}

Page 12: Metodos de ordenamiento

Método Inserción

▪ El método de ordenación por inserción es similar al proceso típico de ordenar tarjetas de nombres (cartas de una baraja) por orden alfabético, que consiste en insertar un nombre en su posición 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 Se comienza por el 50

Procesar 20 5020 Se inserta 20 en la posición 050 se mueve a posición 1

Procesar 40

Procesar 80

Procesar 30

5020 40Se inserta 40 en la posición 1Se mueve 50 a posición 2

5020 40 80 El elemento 80 está bien ordenado

5020 40 8030 Se inserta 30 en posición 1Se desplaza a la derecha la sublista derecha

Page 13: Metodos de ordenamiento

Estructura en JAVA

for(i=1; i<n; i++) {  temp = V[i];  Izq = 0;  Der = i-1;  while(Izq <= Der){    Medio = (Izq+Der)/2;    if (temp < V[Medio])      Der = Medio - 1;    else      Izq = Medio + 1;  }  for (j=i-1; j>=Izq; j--){    V[j+1]=V[j];  }  V[Izq] = temp; }

Page 14: Metodos de ordenamiento

Método Shell

▪ El nombre se debe a su inventor, D. L. Shell. Se suele denominar también ordenación por inserción con incrementos decrecientes. Se considera que el método Shell es una mejora de los métodos de inserción directa.

▪ Shell modifica los saltos contiguos resultantes de las comparaciones por saltos de mayor tamaño y con ello se consigue que la ordenación sea más rápida. Generalmente se toma como salto inicial n/2 (siendo n el número de elementos), luego se reduce el salto a la mitad en cada repetición hasta que el salto es de tamaño 1.

Page 15: Metodos de ordenamiento

74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30Se debe empezar con k=n/2 , siendo n el número de elementos de arreglo, y utilizando siempre la división entera.... después iremos variando k haciéndolo más pequeño 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=5Empezamos con k=5. Así pues, vamos a dividir nuestro arreglo original en 5 sub-arreglo, en los cuales, sus elementos estarán 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 también 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

Ejemplo

Page 16: Metodos de ordenamiento

Ahora, ordenaremos los elementos del sub-arreglo (rojo) pero sólo entre ellos, utilizando el algoritmo de Inserción directa.  

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

  El 30, un elemento relativamente pequeño 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 también 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 después.   30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97

Page 17: Metodos de ordenamiento

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 Están en orden entre ellos, así que se quedan como están. 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 también están en orden entre ellos.

y finalmente el 38 y el 88, que también están en orden. 30 , 11 , 21, 44, 38, 74 , 14 , 78, 65, 88, 97

Page 18: Metodos de ordenamiento

Aún no hemos terminado de ordenarlos. Nuestra k valía 5, así que ahora k←k/2=5/2=2, nuestra nueva k vale 2. Repetimos todo el desarrollo anterior, pero ahora nos saldrán 2 sub-arreglo cuyos elementos están separados por 2 lugares. Tomamos el primer elemento (el 30) contamos 2 lugares y tomamos también 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 según 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 método de inserción:

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

Finalmente ordenamos los negros, pero estos ya están ordenados:

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

Page 19: Metodos de ordenamiento

▪ Finalmente, calculamos un nuevo k dividiendo el que tenemos entre 2. k←k/2=2/2=1 Hemos llegado a k=1. Cuando k es 1 sólo podemos obtener 1 sub-arreglo cuyos elementos están separados 1 posición: el propio arreglo original. Dicho de otra manera... cuando k es 1, el algoritmo de Shell se comporta exactamente igual que el de inserción directa sobre todo el arreglo.

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

▪ El método de inserción directa se comporta tanto mejor cuanto más 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.

Page 20: Metodos de ordenamiento

Estructura en JAVA

void shellSort(int a[], int h){  int i;  while (h > 0)  { for (i = h-1; i<n; i++)    {       int B = a[i];       int j = i;       for (j = i; (j >= h) && (a[j - h] > B); j -= h)       { a[j] = a[j - h];}          a[j] = B;     }       h = h / 2;  }}