unidad 6 métodos de ordenamiento internos ingeniería en sistemas computacionales estructura de...

24
Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Upload: prudencia-raya

Post on 16-Feb-2015

6 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Unidad 6Métodos de Ordenamiento

Internos

Ingeniería en Sistemas Computacionales Estructura de Datos

Page 2: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

6. Ordenación interna

6.1. Algoritmos de ordenamiento por intercambio

6.1.1. Burbuja 6.1.2. Quicksort6.1.3. Shellsort

6.2. Algoritmos de ordenamiento por distribución

6.2.1. Radix

Page 3: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Inserción directa

• Este método consiste en buscar el lugar adecuado para cada registro recorriendo los registros anteriores para dejar un lugar vacío para el nuevo elemento. El proceso de acomodo de cada elemento se repite hasta llegar al último elemento, los elementos previos al elemento a acomodar se encuentran en orden.

• Este es el método usado por los jugadores de cartas para acomodar su juego.

Page 4: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ordenamiento por inserción directa

Variables– K arreglo de datos a ordenar– V variable auxiliar– i, j índices para el arreglo– N número de elementos

InserciónDirectaInicio Para i=2 hasta N incremento 1 v = K(i) //elemento a acomodar j = i Mientras (j > 1) y (K(j-1) > v) K(j) = K(j-1) //mueve elementos j = j-1 K(j) = v // inserta el elemento actualFin

3 8 2 1 4

1 2 3 4 5 6

2K

3 8

2 3 8

1 2 3 8

1 2 3 4 8

1 2 2 3 4 8

Page 5: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Burbuja (Bubble)

• Este método realiza comparaciones de todas las posibles parejas de llaves intercambiando aquellas que se encuentran fuera de orden.

• Utiliza un proceso repetitivo comparando las parejas de datos adyacentes del inicio al final del arreglo donde, después de la primer pasada la llave mayor queda en la última posición del arreglo.

Page 6: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Burbuja (Bubble)Variables• n es el total de elementos• K arreglo de llaves• t variable auxiliar para el intercambio• i,j variables para los indices

BurbujaInicio para i= n-1 ; i>0 ; i-- para j=0; i>j; j++ si (k[j] > k[j+1])

t = k[j]; k[j]= k[j+1]; k[j+1] = t;

Fin

3 8 2 1 4

0 1 2 3 4 5

2K

3 8 2 1 4 2

3 2 8 1 4 2

3 2 1 8 4 2

3 2 1 4 8 2

3 2 1 4 2 8

Primera pasada

Page 7: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

3 2 1 4 2 8

2 3 1 4 2 8

2 1 3 4 2 8

2 1 3 4 2 8

2 1 3 2 4 8

Segunda pasada

2 1 3 2 4 8

1 2 3 2 4 8

1 2 3 2 4 8

1 2 2 3 4 8

Tercer pasada

1 2 2 3 4 8

1 2 2 3 4 8

1 2 2 3 4 8

Cuarta pasada

1 2 2 3 4 8

1 2 2 3 4 8

Quinta pasada

Page 8: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Shell sort

• El método shell divide el arreglo a ordenar en varios grupos haciendo comparaciones e intercambios entre ellos. El tamaño de los subgrupos se decrementa y el número de subgrupos se incrementa hasta llegar a tener n grupos de tamaño 1. A partir de este punto, el método funciona como el de inserción directa.

• El tamaño de los subgrupos así como el total de estos puede determinarlos el usuario para hacer mas eficiente el algoritmo.

Page 9: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Shell sortVariables

– K arreglo de datos a ordenar– H tamaño del grupo– i, j índices para el arreglo– V variable auxiliar– N número de elementos– grupo arreglo con los tamaños de grupo

Shellsort Inicio grupo = [ 21, 7, 3, 1] para g=0; g<4; g++ h=grupo[g]; para i=h; i<n; i++ v=k[i]; j=i; mientras (j>=h && a[j-h]>v) k[j]=k[j-h]; j=j-h; k[j]=v; Fin

3 7 9 0 5 1 6 8 4 2 0 6 1 5 7 3 4 9 8 2 

3 7 9 0 5 1 6 8 4 2 0 6 1 5 7 3 4 9 8 2 

3 3 2 0 5 1 5 7 4 4 0 6 1 6 8 7 9 9 8 2 

3 3 2 5 7 4 1 6 80 5 1 4 0 6 7 9 9 8 2 

0 0 1 3 3 4 5 6 81 2 2 4 5 6 7 7 9 8 9

0 0 1 1 2 2 3 3 4 4 5 6 5 6 8 7 7 9 8 9

0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9

Page 10: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Radix

• Radix Sort (ordenamiento Radix) es un algoritmo de ordenamiento estable* para ordenar elementos identificados por llaves (o claves) únicas. Cada llave debe ser una cadena o un número capaz de ser ordenada alfanuméricamente.

• Este método ejecuta un número de repeticiones igual al número de caracteres de las llaves a ordenar. El Radix Directo, inicia con el dígito más a la derecha repartiendo los datos en “canastas”, estos datos se reparten de nuevo de acuerdo al siguiente dígito y así sucesivamente hasta terminar con el dígito de mas a la izquierda.

Page 11: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

329 248 123 423 226 825 132 335 231 432 256 218

Distribución y reacomodoDigito derecho

329248123

423

226825132

335

231

432 256 218

231 132 432 123 423 825 335 226 256 248 218 329

231

132

432

123

423

825

335226

256248218

329

218 123 423 825 226 329 231 132 432 335 248 256

Distribución y reacomodoDigitocentral

Page 12: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

231

132 432

123 423 825

335226

256

248

218 329

218 123 423 825 226 329 231 132 432 335 248 256

Distribución y reacomodoDigito izquierdo

123 132 218 226 231 248 256 329 335 423 432 825

Page 13: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ejemplo

Page 14: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Algoritmo: Quicksort

Profesora: Dra. Maria Lucia Barrón EstradaAlumno: Guillermo Alberto Sandoval Sánchez

Page 15: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Descripción

• Se elige un pivote.

• Se reubican los elementos respecto al pivote los menores antes, los mayores atrás.

• El arreglo queda separado en dos subarreglos

• Se repite el proceso con los subarreglos resultantes

• El arreglo esta ordenado

Page 16: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Pseudo-código• quicksort(q)• variables arreglos menores, arrPivotes, mayores• si la longitud de q es menor o igual que 1• devolver q• sino • seleccionar un pivote de q• para cada elemento en q excepto el pivote• si el elemento < pivote entonces agregarlo al arreglo menores• si el elemento ≥ pivote entones agregarlo al arreglo mayores• agregar el pivote al arrPivotes• devolver unir(quicksort(menores), arrPivotes, quicksort(mayores))

Page 17: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ejecución por pasos• 4 - 8 - 1 - 7 - 2 - 3 - 5 • 4 - 8 - 1 - 7 - 2 - 3 - 5• 4 - 8 - 1 - 7 - 2 - 3 - 5 • 3 - 8 - 1 - 7 - 2 - 4 - 5• 3 - 8 - 1 - 7 - 2 - 4 - 5• 3 - 4 - 1 - 7 - 2 - 8 - 5 • 3 - 4 - 1 - 7 - 2 - 8 - 5 • 3 - 4 - 1 - 2 - 7 - 8 - 5 • 3 - 4 - 1 - 2 - 5 - 8 - 7

• 3 - 4 - 1 - 2• 1 - 4 - 3 - 2• 1 - 2 - 3 - 4

• 8 - 7 • 7 - 8

• 1 - 2 - 3 - 4 - 5 - 7 - 8

Page 18: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Implementación en Java

• import java.util.Comparator;• import java.util.Random;• public class Quicksort {• public static final Random RND = new Random();• private void swap(Object[] array, int i, int j) {• Object tmp = array[i];• array[i] = array[j];• array[j] = tmp;• }• private int partition(Object[] array, int begin, int end, Comparator cmp) {• int index = begin + RND.nextInt(end - begin + 1);• Object pivot = array[index];• swap(array, index, end); • for (int i = index = begin; i < end; ++ i) {• if (cmp.compare(array[i], pivot) <= 0) {• swap(array, index++, i);• }• }• swap(array, index, end); • return (index);• }• private void qsort(Object[] array, int begin, int end, Comparator cmp){• if (end > begin) {• int index = partition(array, begin, end, cmp);• qsort(array, begin, index - 1, cmp);• qsort(array, index + 1, end, cmp);• }• }• public void sort(Object[] array, Comparator cmp){• qsort(array, 0, array.length - 1, cmp);• }• }

Page 19: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ordenamiento por conteo

• Este método utiliza un arreglo auxiliar para contabilizar el numero de llaves que son mayores que la llave actual.

• El arreglo de contadores, especifica la posición final donde debería estar cada elemento.

Page 20: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ordenamiento por conteo

Variables– K arreglo de datos a ordenar– Cont arreglo de contadores– N número de elementos a ordenar

ComparacionPorConteoInicio inicializar el arreglo de contadores con cero en todas sus posiciones Para i=N hasta 2 decremento 1 Para j=i-1 hasta 1 decremento 1 si K(i) < K(j) Cont(j)++ sino Cont(i)++Fin

Page 21: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ejemplo

23 11 19 8 7

1 2 3 4 5

0 0 0 0 0

1 2 3 4 5

K

Cont

1 1 1 1 0

2 2 2 1 0

3 2 3 1 0

4 2 3 1 0

Inicial

Primera pasada

Segunda pasada

Tercera pasada

Cuarta pasada

Page 22: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ordenamiento por distribución

• Este método es bueno aplicarlo cuando existen muchas claves repetidas y estas se encuentran en un rango pequeño entre u y v.

Rango u<=K1..n<=v

• Utiliza un arreglo contador con posiciones desde u hasta v, además de un arreglo para generar la salida.

Page 23: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ordenamiento por distribuciónVariables

– K arreglo de datos a ordenar– Cont arreglo de contadores con índices desde u hasta v– S arreglo de salida– N número de elementos a ordenar– U llave menor– V llave mayor

DistribuciónInicio inicializar el arreglo de contadores con cero en todas sus posiciones Para i=1 hasta N incremento 1 Cont(K(i))++ // cuenta las llaves iguales Para j=u+1 hasta v incremento 1 Cont(j) = Cont(j) + Cont(j-1) // localiza la posición de cada llave Para j=N hasta 1 decremento 1 i = Cont(K(j)) S(i) = K(j) // envía la llave al vector de salida Cont(K(j)) = Cont(K(j)) - 1Fin

Page 24: Unidad 6 Métodos de Ordenamiento Internos Ingeniería en Sistemas Computacionales Estructura de Datos

Ejemplo

29 31 29 34 29

1 2 3 4 5

Arreglo a ordenar K

Arreglo de contadores

Cont

Arreglo de salida S 29 34

Inicial

Cuenta llaves repetidas

Posición de cada llave

Acomodo en la salida

0 0 0 0 0

29 30 31 32 33 34

3 0 1 0 0

3 3 4 4 4

0

1

5

2 3 4 4 4 4

1 2 3 4 5