ORDENAMIENTO EN TIEMPO LINEAL Foro semana 5 y 6
Integrantes: Sirley Manuela Rojas Salazar Maricela Morales Castrillón
POLITÉCNICO GRANCOLOMBIANO Análisis y verificación de algoritmos
Descripción de cada algoritmo
1. Algoritmo Counting sort
Fue inventado y descubierto por Harold Seward, el único propósito del algoritmo es clasificar los enteros de una lista dada y superará los algoritmos de clasificación de propósito general . Es llamado algoritmo de ordenamiento lineal Asume que cada uno de los elementos a ordenar es un entero en el rango 0 , para algún entero . Cuando = , la ejecución del método es del orden (). Para cada elemento se determina el número de elementos menores a . Usando esta información, es posible posicionar al elemento directamente en el arreglo.
Implementación de Algoritmo JAVA
package algoritmo_de_ordenamiento_tres; import java.util.*; public class algoritmo_de_ordenamiento_tres { public static void sort(int [] a, i nt maximoValor){ int [] bucket=new int[maximoValor+1];
for (int i=0; i
for (int i=0; i
}
int fuerade=0; for (int i=0; i
System.out.println(" Algoritmo Bucket Sort"); System.out.println(" "); System.out.println("Números sin orden: " + Arrays.toString(data)); sort(data,maximoValor); System.out.println(" "); System.out.println("Aplicando el Ordenamiento Bucket : " + Arrays.toString(data)); } }
Resultado:
Algoritmo Bucket Sort
Números sin orden: [128, 120, 113, 200, 98, 24, 12, 4, 2, 1]
Aplicando el Ordenamiento Bucket: [1, 2, 4, 12, 24, 98, 113, 120, 128, 200]
2. Algoritmo Radix Sort El método de ordenación por residuos, o Radix Sort, utiliza una aproximación diferente a la de comparar los elementos del arreglo entre sí. En vez de esto, este algoritmo recorre el arreglo trasladando cada elemento a una cola determinada por el residuo, o dígito menos significativo del número. Cuando todos los elementos han sido trasladados a las colas, se recorren todas las colas en orden trasladando ahora los elementos al vector. El proceso se repite ahora para los demás dígitos de los elementos del vector.
Implementación de Algoritmo JAVA
package algoritmo_de_ordenamiento_dos; import java.util.Scanner; /* facilita la lectura de datos en los programas Java*/
public class Algoritmo_Radix {
/*O (e * (n + c)) b es dígitos en enteros de entrada. c es la base para representar números. */
static void sort(int[] b) { int i, letra = b[0], exp = 1, n = b.length;
int[] c = new int[10];
/*El algoritmo dice que primero necesitamos encontrar el número de dígitos en el número más largo*/
for (i = 1; i < n; i++) if (b[i] > letra) letra = b[i];
/*Aplicando el ciclo (for if) podemos encontrar el máximo de todos los números*/
while (letra/ exp> 0){ int [] bucket= new int [10]; for (i =0; i < n; i++) bucket [(b[i]/ exp)% 10]++; for (i = 1; i < 10; i++) bucket[i] += bucket[i - 1]; for (i = n - 1; i >= 0; i--) c[--bucket[(b[i] / exp) % 10]] = b[i]; for (i = 0; i < n; i++) b[i] = c[i]; exp *= 10;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner ( System.in); /*objeto de la clase Scanner asociado al dispositivo de entrada.*/ System.out.println (" Ejecución Algoritmo Radix "); System.out.println (" ............................");
int n, i; System.out.println(" Ingrese un Número Par ");
n = scan.nextInt(); /* para leer un entero*/ int arr[]= new int [n];
System.out.println("\n Ingrese " + n + " números enteros"); for (i = 0; i < n; i++) arr[i] = scan.nextInt();
sort(arr);
System.out.println(" Números De forma Ordenada" + " "); for (i = 0; i < n; i++) System.out.print(arr[i]+" ");
System.out.println(); }
} Resultado: Ejecución Algoritmo Radix Ingrese un Número Par 4 Ingrese 4 números enteros 6 2 10 2 Números De forma Ordenada 2 2 6 10
3. Algoritmo Bucket sort Es un algoritmo de ordenamiento que distribuye todos los elementos a ordenar entre un número finito de casilleros. Cada casillero sólo puede contener los elementos que cumplan unas determinadas condiciones. En el ejemplo esas condiciones son intervalos de números. Las condiciones deben ser excluyentes entre sí, para evitar que un elemento pueda ser clasificado en dos casilleros distintos. Después cada uno de esos casilleros se ordena individualmente con otro algoritmo de ordenación (que podría ser distinto según el casillero), o se aplica recursivamente este algoritmo para obtener casilleros con menos elementos. Complejidad = n log n Este sigue una secuencia de pasos:
Crear una colección de casilleros vacíos Colocar cada elemento a ordenar en un único casillero Ordenar individualmente cada casillero devolver los elementos de cada casillero concatenados por orden.
Implementación de Algoritmo JAVA
package algoritmo_de_ordenamiento_tres;
import java.util.*; public class algoritmo_de_ordenamiento_tres { public static void sort(int[] a, int maximoValor){ int [] bucket=new int[maximoValor+1];
for (int i=0; i
for (int i=0; i
int fuerade=0; for (int i=0; i
System.out.println(" Algoritmo Bucket Sort"); System.out.println(" "); System.out.println("Números sin orden: " + Arrays.toString(data)); sort(data,maximoValor); System.out.println(" "); System.out.println("Aplicando el Ordenamiento Bucket : " + Arrays.toString(data)); } } Resultado: Algoritmo Bucket Sort
Números sin orden: [128, 120, 113, 200, 98, 24, 12, 4, 2, 1] Aplicando el Ordenamiento Bucket : [1, 2, 4, 12, 24, 98, 113, 120, 128, 200]
4. Algoritmo más adecuado que los comparaciones (estudiados en las lecturas).
algoritmos
basados
en
Los algoritmos de ordenamiento son procesos que ordenan los elementos de un arreglo de acuerdo con cierto criterio (llamado relación de orden). Consideramos que lo más adecuado basados en los estudios de las lecturas sobre:
Ordenamiento Ordenamiento Ordenamiento Ordenamiento Ordenamiento Ordenamiento
por Selección (Insertion Sort) por Inserción (Insertion Sort) de Burbuja (Bubble Sort) por Mezcla (Merge Sort) Rápido (Quick Sort) Chiflado (Stogee Sort)
Se debe identificar básicamente el escenario adecuado para saber de esta manera con que algoritmo se debe operar con el fin de optimizar el mejor caso y encontrar una solución rápida, algo que pudimos evidenciar es: los algoritmos lentos se comportan en un orden cuadrático, es decir, O(n²), mientras que los algoritmos rápidos se comportan, en un caso promedio en un orden logarítmico, es decir, O (n log n). Con esta base podremos tener la idea de que algoritmo será el apr opiado. 5. Cuadro comparativo de los tres algoritmos.
ALGORITMOS DE ORDENAMIENTO EN TIEMPO LINEAL ASPECTOS
COUNTING SORT
Este algoritmo es bueno para ordenar multi conjuntos 1. Maneras de (donde cada elemento puede Comprender ser presente muchas veces), pero pobre para diccionarios no posee la sentencia if Es un algoritmo de ordenamiento por cuentas 2. Facilidad de son: O (n+k) O (n+k) No Implementación comparativo, utiliza el diapasón de los números del array a ordenar (lista) para calcular los elementos que coinciden.
RADIX SORT
Es un algoritmo de clasificación de tiempo lineal que ordena en tiempo O (n + k) cuando los elementos están en el rango de 1 a k. La idea de Ordenar radix es hacer una clasificación dígito por dígito comenzando desde el dígito menos significativo hasta el dígito más significativo.
BUCKET SORT
es principalmente útil cuando la entrada se distribuye uniformemente en un rango.
Se trata de una generalización del algoritmo Pigeonhole sort. Cuando los elementos a ordenar están uniformemente distribuidos la complejidad computacional de este algoritmo es de O(n). El algoritmo contiene los siguientes pasos: 1. Crear una colección de casilleros vacíos2. Colocar cada elemento a ordenar en un único casillero 3. Ordenar individualmente cada casillero 4. devolver los elementos de cada casillero concatenados por orden 5.
Sólo puede ser aplicado en elementos en un intervalo de a lo más k elementos, típicamente en números 3. Restricciones de naturales en el rango de 1 a k. datos Su cota de tiempo es de O (n + k ), por lo que para ser mejor que el ordenamiento a base de comparaciones, se debe cumplir que k < O.
4. Eficiencia
No podemos usar la ordenación por conteo porque la clasificación por conteo tomará O (n 2 ).
Requiere más memoria auxiliar para los cubos a costa del tiempo de ejecución que más géneros de comparación. Funciona en O (n + k) O (n + k) tiempo en el caso promedio donde n es la cantidad de elementos que se ordenarán y k es la cantidad de cubos.
No existe un mejor y peor Es rápido a diferencia de Es eficiente y veloz método caso, todos los casos se tratan otros algoritmos de de ordenamiento interno iguales ordenamiento como: Ordenamiento por Mezcla (Merge Sort) Ordenamiento Rápido (Quick Sort)
5. Memoria
6. Nombre Traducido 7. Desventajas
O(n+k )
O(n)
Ordenamiento por cuentas
Ordenamiento Radix
Almacena muchos datos de memoria
x
O(n)
Ordenamiento por casilleros
No es eficiente cuando la cantidad de casilleros es mayor a la cantidad de claves, tampoco cuando el rango es desconocido El algoritmo no funciona de manera correcta cuando las claves son muy largas, como el tiempo de clasificación total es
proporcional a la longitud de la clave y el número de elementos a ordena.
Referencias: http://metodosordenamiento.blogspot.com.co/2015/01/metodos-de-ordenamiento.html https://www.researchgate.net/profile/Jorge_Rios2/publication/277114031_Algoritmo_de_ordena miento_por_comparaciones_Heapinsert_Sort/links/56f92d9e08ae7c1fda311181/Algoritmo-deordenamiento-por-comparaciones-Heapinsert-Sort.pdf http://www.olimpiadadeinformatica.org.mx/omi/omi/archivos/apuntes/AnalisisDeComplejidad.ht m http://metododeordenacion.blogspot.com.co/p/algoritmo-de-ordenamiento.html https://sites.google.com/site/algoritmoshellsort/ventajas-y-desventajas http://www.academia.edu/14702301/Cat%C3%A1logo_de_Algoritmos_Asignatura_An%C3%A1lisi s_de_Algoritmos