Ordenamiento en tiempo lineal Agustn J Gonzlez ELO

  • Slides: 6
Download presentation
Ordenamiento en tiempo lineal Agustín J. González ELO 320: Estructura de Datos y Algoritmos

Ordenamiento en tiempo lineal Agustín J. González ELO 320: Estructura de Datos y Algoritmos 1 er. Sem 2004 1

Idea n n Hasta ahora los algoritmos vistos se basan en la comparación de

Idea n n Hasta ahora los algoritmos vistos se basan en la comparación de números para obtener el orden. Se puede probar que los algoritmos basados en esta técnica tienen como cota inferior un costo (n lg n). Exploraremos dos algoritmos: Counting. Sort y Radix. Sort. Estos algoritmos suponen un rango acotado para la entrada y logran hacer un ordenamiento en tiempo cercano a lineal. 2

Counting. Sort n n n Asume que cada uno de los n elementos a

Counting. Sort n n n Asume que cada uno de los n elementos a ordenar es un entero en el rango 1 a k , k n. La idea es determinar, para cada entrada x, el número de elementos menor que x. Así es posible ubicar x directamente en la posición dentro del arreglo. Se A[1. . n] el arreglo de entrada. Counting. Sort utiliza un arreglo C[1. . k] y genera el resultado en otro arreglo, digamos B[1. . n]. 3|6|4 |1|3|4|1|4 A C 2|0|2|3|0|1 C B C | | | 2|2|4|6|7|8 | 4 | B C 2|2|4|7|7|8 |1 | | | 4 | 1|2|4|6|7|8 3

Algoritmo Counting. Sort(A, B, k) { for (i=1; i< = k; i++) C[i] =

Algoritmo Counting. Sort(A, B, k) { for (i=1; i< = k; i++) C[i] = 0; for (j=1; j< = Largo(A); j++) C[A[j]]++; /* hasta aquí C [i] contiene el número de elementos igual a i*/ for (i=2; i< = k; i++) C[i]+=C[i-1]; /* hasta aquí C [i] contiene el número de elementos menor que o igual a i*/ for ( j= Largo (A); j > 0; j--) { B[C[A[j]]] = A[j]; C[A[j]] --; } } (k) (n) (k) (n) (n+k) = (n), k<n 4

Radix Sort n La idea es ordenar los números dígito por dígito. 329 457

Radix Sort n La idea es ordenar los números dígito por dígito. 329 457 657 839 436 720 355 n n n 720 355 436 457 657 329 839 720 329 436 839 355 457 657 329 355 436 457 657 720 839 Se ordena desde el menos al más significativo. Cada vez se aplica Counting. Sort. Para ordenar d dígitos se toma un tiempo (dn+dk) 5

Algoritmo Radix sort n n n Radix. Sort(A, d) { for (i=1; i <=

Algoritmo Radix sort n n n Radix. Sort(A, d) { for (i=1; i <= d; i++) use un ordenamiento estable para ordenar arreglo A sobre digito i; } Un algoritmo de ordenamiento es estable si el orden de elementos “iguales” es preservado. Cuando se usa Counting. Sort el costo en tiempo es (dn+dk). Si k es acotado y d también, esto conduce a un tiempo (n). Desgraciadamente Counting. Sort requiere espacios de memoria adicionales al requerido para mantener los datos a ordenar. Por ello, si la capacidad de memoria es un factor importante, quicksort es preferible. Otra característica interesante de los algoritmos de ordenamiento es, si el ordenamiento se hace en el mismo espacio o requiere memoria adicional. ¿Cómo es heapsort? ¿Quicksort? ¿Insertion sort? ¿Mergesort? 6