Professional Documents
Culture Documents
Radix- Sort
Flores Wong Rosa Elena Mendoza Ibarra Mayra Ayala Inzunza Briseida
Estructura de Datos Prof. Doc. Lucia Barrn
HISTORIA
EE.UU., 1880: no se puede terminar el censo de la dcada anterior (en concreto, no se llega a contar el nmero de habitantes solteros) Herman Hollerith (empleado de la oficina del censo, de 20 aos de edad) inventa una mquina tabuladora elctrica para resolver el problema; en esencia es una implementacin fsica del radix sort 1890: se usan unas 100 mquinas de Hollerith para tabular las listas del censo de la dcada (un operador experto procesaba 19.071 tarjetas en una jornada laboral de 65 horas, unas 49 tarjetas por minuto) 1896: Hollerith crea la empresa Tabulating Machine Company 1900: Hollerith resuelve otra crisis federal inventando una nueva mquina con alimentacin automtica de tarjetas (til, con ms o menos variaciones, hasta 1960) 1911: la empresa de Hollerith se fusiona con otras dos, creando la Calculating-Tabulating- Recording Company (CTR) 1924: Thomas Watson cambia el nombre a la CTR y la llama International Business Machines (IBM) El resto de la historia es bien conocido hasta: 2000: crisis del recuento de votos en las Presidenciales El resto de la historia es bien conocido
Radix Sort
Es un algoritmo de ordenamiento que ordena enteros procesando sus dgitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, nmeros en punto flotante especialmente formateados, radix sort no est limitado slo a los enteros.
Descripcin
Este mtodo se puede considerar como una generalizacin de la clasificacin por urnas. Consiste en hacer diversos montones de fichas, cada uno caracterizado por tener en sus componentes un mismo digito (letra si es alfabtica) en la misma posicin; estos montones se recogen en orden ascendente y se reparte en montones segn el siguiente digito de la clave.
Ejemplo
345, 721, 425, 572, 836, 467, 672, 194, 365, 236, 891, 746, 431, 834, 247, 529, 216, 389 Paso 1: atendiendo el digito de menor peso (unidades);
216 431 365 746
891
721
672
572
834
194
425
345
236
836
247
467
389
529
721, 891, 431, 572, 672, 194, 834, 345, 425, 365, 836, 236, 746, 216, 467, 347, 529, 389.
1
216 746
2
721 247 425 365
3
529 467
4
431 572
6
834 672
7
866 389 236 891
8
345 194
Continuacin:
194
216
345
425
529
672
721
834
tomando de nuevo los montones en orden la secuencia de fichas queda ya ordenada: 194 467 216 529 236 572 247 672 345 721 365 746 389 834 425 836 431 891
Clasificacin
el de dgito menos significativo (LSD) el de dgito ms significativo (MSD). Radix sort LSD procesa las representaciones de enteros empezando por el dgito menos significativo y movindose hacia el dgito ms significativo. Radix sort MSD trabaja en sentido contrario.
Ejemplo
Vector original: 25 57 48 37 12 92 86 33 Asignamos los elementos en colas basadas en el dgito menos significativo de cada uno de ellos. 0: 1: 2: 12 92 3: 33 4: 5: 25 6: 86 7: 57 37 8: 48 9: Despus de la primera pasada, la ordenacin queda: 12 92 33 25 86 57 37 48 Colas basadas en el dgito ms significativo. 0: 1: 12 2: 25 3: 33 37 4: 485: 57 6: 7: 8: 86 9: 92 Lista ordenada: 12 25 33 37 48 57 86 92
Estos mtodos no comparan llaves; sino que procesan y comparan pedazos de llaves.
Estabilidad
Un algoritmo de ordenamiento se considera estable si preserva el orden relativo de llaves iguales en la estructura de datos-.
Ejemplo
si queremos ordenar por calificacin una lista de asistencia que se encuentra ordenada alfabticamente, un algoritmo estable produce una lista en la que los estudiantes con el mismo grado se mantienen ordenados alfabticamente, mientras que un algoritmo inestable no dejar trazas del ordenamiento original. La mayora de los mtodos bsicos son estables, pero la mayora de los mtodos sofisticados no lo son.
Una variante al mtodo de intercambio radix consiste en examinar los bits de derecha a izquierda. El mtodo depende de que el proceso de particin de un bit sea estable. Por lo que el proceso de particin utilizado en el algoritmo de intercambio radix no nos sirve; el proceso de particin es como ordenar una estructura con solo dos valores, por lo que el algoritmo de distribucin por conteo nos sirve muy bien.
Depende en que las llaves estn compuestas de bits aleatorios en un orden aleatorio. Si esta condicin no se cumple ocurre una fuerte degradacin en el desempeo de estos mtodos. Adicionalmente, requiere de espacio adicional para realizar los intercambios. Los algoritmos de ordenamiento basados en radix se consideran como de propsito particular debido a que su factibilidad depende de propiedades especiales de las llaves, en contraste con algoritmos de propsito general como Quicksort que se usan con mayor frecuencia debido a su adaptabilidad a una mayor variedad de aplicaciones.
Nota:
El ordenamiento por radix puede ejecutarse hasta en el doble de velocidad que Quicksort, pero no vale la pena intentarlo si existe problemas potenciales de espacio de almacenamiento o si las llaves son de tamao variable y/o no son aleatorias.
TIEMPO
3n
3n
Si 'la v' es una constante, la clase de raz toma el tiempo lineal, la O (n). Note sin embargo que si todos los nmeros en la serie son diferentes entonces la v es al menos la O (n), entonces la O (log (n)) pasa son necesario, la O (nlog (n)) - el tiempo en general.
ESPACIO
Si una serie temporal es usada, el espacio de trabajo suplementario usado es la O (n). Es posible hacen la clasificacin sobre cada posicin de dgito in situ y luego slo la O (log (n)) el espacio es necesario para guardar la pista de las secciones de serie an para ser procesado, recurrentemente o sobre un montn explcito
Cdigo
public class radixSort { public int [][] cam(int[]arr){ if(arr.length == 0) return null; int[][] np = new int[arr.length][2]; //matrice int[] q = new int[256]; int i,j,k,l,f = 0; for(k=0;k<4;k++){ for(i=0;i<(np.length-1);i++) np[i][1] = i+1; np[i][1] = -1; for(i=0;i<q.length;i++) q[i] = -1; for(f=i=0;i<arr.length;i++){ j = ((255<<(k<<3))&arr[i])>>(k<<3); if(q[j] == -1) l = q[j] = f; else{ l = q[j]; while(np[l][1] != -1) l = np[l][1]; np[l][1] = f; l = np[l][1]; } f = np[f][1]; np[l][0] = arr[i]; np[l][1] = -1;
} }
Prueba
public class Prueba {
public static void main (String[] args) { radixSort rs=new radixSort();
}
}