Algoritmo de ordenamiento Algoritmo de ordenamiento Radix- Sort Radix- Sort Flores Wong Rosa Elena Flores Wong Rosa Elena Mendoza Ibarra Mayra Mendoza Ibarra Mayra Ayala Inzunza Briseida Ayala Inzunza Briseida Estructura de Datos Estructura de Datos Prof. Doc. Lucia Barrón Prof. Doc. Lucia Barrón
21
Embed
Algoritmo de ordenamiento Radix- Sort Flores Wong Rosa Elena Mendoza Ibarra Mayra Ayala Inzunza Briseida Estructura de Datos Prof. Doc. Lucia Barrón.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Algoritmo de Algoritmo de
ordenamientoordenamiento Radix- SortRadix- Sort
Flores Wong Rosa ElenaFlores Wong Rosa ElenaMendoza Ibarra Mayra Mendoza Ibarra Mayra Ayala Inzunza BriseidaAyala Inzunza Briseida
Estructura de DatosEstructura de DatosProf. Doc. Lucia BarrónProf. Doc. Lucia Barrón
HISTORIAHISTORIA
EE.UU., 1880EE.UU., 1880: no se puede terminar el censo de la década anterior : no se puede terminar el censo de la década anterior (en concreto, no se llega a contar el número de habitantes solteros)(en concreto, no se llega a contar el número de habitantes solteros)
– – Herman HollerithHerman Hollerith (empleado de la oficina del censo, de 20 años (empleado de la oficina del censo, de 20 años de edad) inventa una de edad) inventa una máquina tabuladora eléctricamáquina tabuladora eléctrica para para resolver el problema; en esencia resolver el problema; en esencia es una implementación física es una implementación física del del radix sortradix sort 1890 1890: se usan unas 100 máquinas de Hollerith para : se usan unas 100 máquinas de Hollerith para tabular las listas del censo de la década (un operador experto tabular las listas del censo de la década (un operador experto procesaba 19.071 tarjetas en una jornada laboral de 6’5 horas, unas procesaba 19.071 tarjetas en una jornada laboral de 6’5 horas, unas 49 tarjetas por minuto)49 tarjetas por minuto)
– – 1896:1896: Hollerith crea la empresa Hollerith crea la empresa Tabulating Machine CompanyTabulating Machine Company 19001900: Hollerith resuelve otra crisis federal inventando una nueva : Hollerith resuelve otra crisis federal inventando una nueva máquina con alimentación automática de tarjetas (útil, con más o máquina con alimentación automática de tarjetas (útil, con más o menos variaciones, hasta 1960)menos variaciones, hasta 1960)
– – 19111911: la empresa de Hollerith se fusiona con otras dos, creando la : la empresa de Hollerith se fusiona con otras dos, creando la Calculating-Tabulating-Calculating-Tabulating- Recording Company Recording Company (CTR)(CTR)
– – 1924: Thomas Watson1924: Thomas Watson cambia el nombre a la CTR y la llama cambia el nombre a la CTR y la llama International Business Machines International Business Machines (IBM)(IBM) El resto de la historia es El resto de la historia es
bien conocido… hasta: – 2000: crisis del recuento de votos en las bien conocido… hasta: – 2000: crisis del recuento de votos en las Presidenciales El resto de la historia es bien conocido… Presidenciales El resto de la historia es bien conocido…
Radix SortRadix Sort
Es un Es un algoritmo de ordenamientoalgoritmo de ordenamiento que ordena enteros procesando sus que ordena enteros procesando sus dígitos de forma individual. Como dígitos de forma individual. Como los enteros pueden representar los enteros pueden representar cadenas de caracteres (por cadenas de caracteres (por ejemplo, nombres o fechas) y, ejemplo, nombres o fechas) y, especialmente, números en punto especialmente, números en punto flotante especialmente flotante especialmente formateados, formateados, radix sortradix sort no está no está limitado sólo a los enteros.limitado sólo a los enteros.
DescripciónDescripción
Este método se puede considerar como una Este método se puede considerar como una generalización de la clasificación por urnas. generalización de la clasificación por urnas.
Consiste en hacer diversos montones de Consiste en hacer diversos montones de fichas, cada uno caracterizado por tener en fichas, cada uno caracterizado por tener en sus componentes un mismo digito (letra si sus componentes un mismo digito (letra si es alfabética) en la misma posición; estos es alfabética) en la misma posición; estos montones se recogen en orden ascendente montones se recogen en orden ascendente y se reparte en montones según el y se reparte en montones según el siguiente digito de la clave. siguiente digito de la clave.
Paso 1: atendiendo el digito de menor peso Paso 1: atendiendo el digito de menor peso (unidades);(unidades);
216
431 365 746
891 672 834 425 236 247 389
721 572 194 345 836 467 529
1 2 4 5 6 7 9
Tomando los montones en orden, la secuencia de fichas Tomando los montones en orden, la secuencia de fichas quedarían:quedarían:721, 891, 431, 572, 672, 194, 834, 345, 425, 365, 836, 721, 891, 431, 572, 672, 194, 834, 345, 425, 365, 836, 236, 746, 216, 467, 347, 529, 389.236, 746, 216, 467, 347, 529, 389.
Paso 2: distribuimos las secuencia de fichas Paso 2: distribuimos las secuencia de fichas en montones respecto al segundo digito:en montones respecto al segundo digito:
236
529 836 247
425 834 746 467 672 194
216 721 431 345 365 572 389 891
1 2 3 4 6 7 8 9tomando de nuevo los montones en orden la
secuencia de fichas quedari asi:
216 721 425 529 431 834 866 236 345
746 247 365 467 572 672 389 891 194
Continuación:Continuación:
Paso 3: se distribuye de nuevo las fichas Paso 3: se distribuye de nuevo las fichas respecto al tercer digito:respecto al tercer digito:
247 389 467 891
236 365 431 572 746 836
194 216 345 425 529 672 721 834
1 2 3 4 5 6 7 8tomando de nuevo los montones en orden la
secuencia de fichas queda ya ordenada:
194 216 236 247 345 365 389 425 431
467 529 572 672 721 746 834 836 891
ClasificaciónClasificación
el de dígito menos significativo (el de dígito menos significativo (LSDLSD) ) el de dígito más significativo (el de dígito más significativo (MSDMSD). ). Radix sort LSDRadix sort LSD procesa las procesa las
representaciones de enteros representaciones de enteros empezando por el dígito menos empezando por el dígito menos significativo y moviéndose hacia el significativo y moviéndose hacia el dígito más significativo. dígito más significativo.
Radix sort MSDRadix sort MSD trabaja en sentido trabaja en sentido contrario.contrario.
Radix sort MSDRadix sort MSD
"b, c, d, e, f, g, h, i, j, ba""b, c, d, e, f, g, h, i, j, ba"
OrdenadaOrdenada
"b, ba, c, d, e, f, g, h, i, j""b, ba, c, d, e, f, g, h, i, j"
Vector original:Vector original:25 57 48 37 12 92 86 3325 57 48 37 12 92 86 33Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos.Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos.0:0:1:1:2: 12: 122 9 9223: 33: 3334:4:5: 25: 2556: 86: 8667: 57: 577 3 3778: 48: 4889:9:Después de la primera pasada, la ordenación queda:Después de la primera pasada, la ordenación queda:12 92 33 25 86 57 37 4812 92 33 25 86 57 37 48Colas basadas en el dígito más significativo.Colas basadas en el dígito más significativo.0:0:1: 1: 11222: 2: 22553: 3: 333 3 33774: 4: 4485: 85: 55776:6:7:7:8: 8: 88669: 9: 9922Lista ordenada:Lista ordenada:12 25 33 37 48 57 86 9212 25 33 37 48 57 86 92
ORDENAMIENTO POR ORDENAMIENTO POR RADIXRADIX
Estos métodos no comparan Estos métodos no comparan llaves; sino que procesan y llaves; sino que procesan y comparan pedazos de llaves. comparan pedazos de llaves.
Estabilidad Estabilidad
Un algoritmo de ordenamiento se Un algoritmo de ordenamiento se considera estable si preserva el considera estable si preserva el orden relativo de llaves iguales en orden relativo de llaves iguales en la estructura de datos-. la estructura de datos-.
EjemploEjemplo
si queremos ordenar por calificación si queremos ordenar por calificación una lista de asistencia que se una lista de asistencia que se encuentra ordenada alfabéticamente, encuentra ordenada alfabéticamente, un algoritmo estable produce una lista un algoritmo estable produce una lista en la que los estudiantes con el mismo en la que los estudiantes con el mismo grado se mantienen ordenados grado se mantienen ordenados alfabéticamente, mientras que un alfabéticamente, mientras que un algoritmo inestable no dejará trazas algoritmo inestable no dejará trazas del ordenamiento original. La mayoría del ordenamiento original. La mayoría de los métodos básicos son estables, de los métodos básicos son estables, pero la mayoría de los métodos pero la mayoría de los métodos sofisticados no lo son. sofisticados no lo son.
Ordenamiento por Ordenamiento por radix directo radix directo Una variante al método de intercambio Una variante al método de intercambio
radix consiste en examinar los bits de radix consiste en examinar los bits de derecha a izquierda. El método depende derecha a izquierda. El método depende de que el proceso de partición de un bit de que el proceso de partición de un bit sea estable. Por lo que el proceso de sea estable. Por lo que el proceso de partición utilizado en el algoritmo de partición utilizado en el algoritmo de intercambio radix no nos sirve; el intercambio radix no nos sirve; el proceso de partición es como ordenar proceso de partición es como ordenar una estructura con solo dos valores, por una estructura con solo dos valores, por lo que el algoritmo de distribución por lo que el algoritmo de distribución por conteo nos sirve muy bien. conteo nos sirve muy bien.
Análisis de eficiencia de Análisis de eficiencia de los ordenamientos por los ordenamientos por radix radix Depende en que las llaves estén compuestas de bits Depende en que las llaves estén compuestas de bits
aleatorios en un orden aleatorio. Si esta condición no aleatorios en un orden aleatorio. Si esta condición no se cumple ocurre una fuerte degradación en el se cumple ocurre una fuerte degradación en el desempeño de estos métodos. Adicionalmente, desempeño de estos métodos. Adicionalmente, requiere de espacio adicional para realizar los requiere de espacio adicional para realizar los intercambios. intercambios.
Los algoritmos de ordenamiento basados en radix se Los algoritmos de ordenamiento basados en radix se consideran como de propósito particular debido a que consideran como de propósito particular debido a que su factibilidad depende de propiedades especiales de su factibilidad depende de propiedades especiales de las llaves, en contraste con algoritmos de propósito las llaves, en contraste con algoritmos de propósito general como Quicksort que se usan con mayor general como Quicksort que se usan con mayor frecuencia debido a su adaptabilidad a una mayor frecuencia debido a su adaptabilidad a una mayor variedad de aplicaciones. variedad de aplicaciones.
Nota:Nota:
El ordenamiento por radix puede El ordenamiento por radix puede ejecutarse hasta en el doble de ejecutarse hasta en el doble de velocidad que Quicksort, pero no velocidad que Quicksort, pero no vale la pena intentarlo si existe vale la pena intentarlo si existe problemas potenciales de espacio problemas potenciales de espacio de almacenamiento o si las llaves de almacenamiento o si las llaves son de tamaño variable y/o no son de tamaño variable y/o no son aleatorias.son aleatorias.
Análisis del Método Análisis del Método Radix SortRadix Sort
Suponemos que el vector “V” tiene Suponemos que el vector “V” tiene n n elementos.elementos.Al ser el campo clave entero el numero urnas es Al ser el campo clave entero el numero urnas es
d=10. Ad=10. Además el numero de dijitos de que consta demás el numero de dijitos de que consta el campo clave va ser el campo clave va ser k. k. Con estas premisas y Con estas premisas y teniendo en cuenta los dos bucles anidados de teniendo en cuenta los dos bucles anidados de que consta el algoritmo principal, tenemos que el que consta el algoritmo principal, tenemos que el tiempo de ejecución es tiempo de ejecución es O(k*n+K*d).O(k*n+K*d).
Si las claves se consideran como cadenas binarias Si las claves se consideran como cadenas binarias de longitud de longitud log(n) log(n) entonces entonces K=log (n)K=log (n) y el método y el método Radix Sort tomará un tiempo de ejecución:Radix Sort tomará un tiempo de ejecución:
O(nlog n)O(nlog n)
TIEMPO 3nTIEMPO 3n
3n 3n (falta formula general)(falta formula general)
Si 'la v' es una constante, la clase de Si 'la v' es una constante, la clase de raíz toma el tiempo lineal, la O (n). raíz toma el tiempo lineal, la O (n). Note sin embargo que si todos los Note sin embargo que si todos los números en la serie son diferentes números en la serie son diferentes entonces la v es al menos la O (n), entonces la v es al menos la O (n), entonces la O (entonces la O (loglog (n)) pasa son (n)) pasa son necesario, la O (nlog (n)) - el tiempo en necesario, la O (nlog (n)) - el tiempo en general.general.
ESPACIOESPACIO
Si una serie temporal es usada, el Si una serie temporal es usada, el espacio de trabajo suplementario espacio de trabajo suplementario usado es la O (n). Es posible hacen usado es la O (n). Es posible hacen la clasificación sobre cada posición la clasificación sobre cada posición de dígito in situ y luego sólo la O de dígito in situ y luego sólo la O ((loglog (n)) el espacio es necesario (n)) el espacio es necesario para guardar la pista de las para guardar la pista de las secciones de serie aún para ser secciones de serie aún para ser procesado, recurrentemente o procesado, recurrentemente o sobre un montón explícitosobre un montón explícito
CódigoCódigo
public class radixSort {public class radixSort { public int [][] cam(int[]arr){ public int [][] cam(int[]arr){ if(arr.length == 0) return null;if(arr.length == 0) return null; int[][] np =int[][] np = new int[arr.length][2]; //matricenew int[arr.length][2]; //matrice int[] q = new int[256];int[] q = new int[256]; int i,j,k,l,f = 0;int i,j,k,l,f = 0; for(k=0;k<4;k++){for(k=0;k<4;k++){ for(i=0;i<(np.length-1);i++)for(i=0;i<(np.length-1);i++) np[i][1] = i+1;np[i][1] = i+1; np[i][1] = -1;np[i][1] = -1; for(i=0;i<q.length;i++)for(i=0;i<q.length;i++) q[i] = -1;q[i] = -1; for(f=i=0;i<arr.length;i++){for(f=i=0;i<arr.length;i++){ j = ((255<<(k<<3))&arr[i])>>(k<<3);j = ((255<<(k<<3))&arr[i])>>(k<<3); if(q[j] == -1)if(q[j] == -1) l = q[j] = f;l = q[j] = f; else{else{ l = q[j];l = q[j]; while(np[l][1] != -1)while(np[l][1] != -1) l = np[l][1];l = np[l][1]; np[l][1] = f; l = np[l][1];np[l][1] = f; l = np[l][1]; }}