Algoritmo de Ordenación

aunque hay un gran número de Algoritmos de ordenación, en las implementaciones prácticas predominan algunos algoritmos. La ordenación por inserción es ampliamente utilizada para conjuntos de datos pequeños, mientras que para conjuntos de datos grandes se utiliza una ordenación asintóticamente eficiente, principalmente ordenación por montón, ordenación por fusión o quicksort. Las implementaciones eficientes generalmente usan un algoritmo híbrido, combinando un algoritmo asintóticamente eficiente para la ordenación general con la ordenación por inserción para listas pequeñas en la parte inferior de una recursión., Las implementaciones altamente ajustadas usan variantes más sofisticadas, como Timsort (merge sort, insertion sort y additional logic), que se usa en Android, Java y Python, e introsort (quicksort y heap sort), que se usa (en formas variantes) en algunas implementaciones de ordenación en C++ y en .NET.

para datos más restringidos, como números en un intervalo fijo, los tipos de distribución como counting sort o radix sort son ampliamente utilizados. La clasificación de burbujas y las variantes rara vez se usan en la práctica, pero se encuentran comúnmente en la enseñanza y las discusiones teóricas.,

cuando se ordenan físicamente objetos (como alfabetizar documentos, pruebas o libros) las personas generalmente utilizan intuitivamente clases de inserción para conjuntos pequeños. Para conjuntos más grandes, las personas a menudo primer cubo, como por letra inicial, y el bucketing múltiple permite la clasificación práctica de conjuntos muy grandes. A menudo, el espacio es relativamente barato, por ejemplo, extendiendo objetos en el suelo o sobre un área grande, pero las operaciones son costosas, particularmente mover un objeto a una gran distancia: la localidad de referencia es importante., Las ordenaciones de fusión también son prácticas para objetos físicos, particularmente porque se pueden usar dos manos, una para cada lista para fusionar, mientras que otros algoritmos, como la clasificación en montón o la clasificación rápida, no son adecuados para uso humano. Otros algoritmos, como la ordenación de bibliotecas, una variante de ordenación por inserción que deja espacios, también son prácticos para uso físico.

sortsEdit

dos de los tipos más simples son el tipo de inserción y el tipo de selección, los cuales son eficientes en datos pequeños, debido a la baja sobrecarga, pero no son eficientes en datos grandes., La ordenación por inserción es generalmente más rápida que la ordenación por selección en la práctica, debido a menos comparaciones y un buen rendimiento en datos casi ordenados, y por lo tanto se prefiere en la práctica, pero la ordenación por selección utiliza menos Escrituras, y por lo tanto se utiliza cuando el rendimiento de escritura es un factor limitante.

Insertion sortEdit

Artículo principal: Insertion sort

Insertion sort es un algoritmo de clasificación simple que es relativamente eficiente para listas Pequeñas y listas ordenadas en su mayoría, y a menudo se usa como parte de algoritmos más sofisticados., Funciona tomando elementos de la lista uno por uno e insertándolos en su posición correcta en una nueva lista ordenada similar a como ponemos dinero en nuestra billetera. En las matrices, la nueva lista y los elementos restantes pueden compartir el espacio de la matriz, pero la inserción es costosa, requiriendo cambiar todos los elementos siguientes por uno. Shellsort (ver más abajo) es una variante de ordenación de inserción que es más eficiente para listas más grandes.

selection sortEdit

Artículo principal: Selection sort

Selection sort es una clasificación de comparación en el lugar., Tiene complejidad O (n2), por lo que es ineficiente en listas grandes, y generalmente se desempeña peor que el tipo de inserción similar. Selection sort se caracteriza por su simplicidad, y también tiene ventajas de rendimiento sobre algoritmos más complicados en ciertas situaciones.

el algoritmo encuentra el valor mínimo, lo intercambia con el valor en la primera posición y repite estos pasos para el resto de la lista. No hace más que n swaps, y por lo tanto es útil donde el intercambio es muy caro.,

sortsEdit Efficient

los algoritmos prácticos de ordenación general casi siempre se basan en un algoritmo con complejidad de tiempo promedio (y generalmente complejidad de peor caso) O(n log n), de los cuales los más comunes son clasificación en montón, ordenación combinada y quicksort. Cada uno tiene ventajas e inconvenientes, siendo el más significativo que la implementación simple de merge sort usa O(n) espacio adicional, y la implementación simple de quicksort tiene o (n2) complejidad en el peor de los casos. Estos problemas se pueden resolver o mejorar a costa de un algoritmo más complejo.,

mientras que estos algoritmos son asintóticamente eficientes en datos aleatorios, para la eficiencia práctica en datos del mundo real se utilizan varias modificaciones. En primer lugar, la sobrecarga de estos algoritmos se vuelve significativa en datos más pequeños, por lo que a menudo se utiliza un algoritmo híbrido, comúnmente cambiando a la ordenación por inserción una vez que los datos son lo suficientemente pequeños. En segundo lugar, los Algoritmos a menudo funcionan mal en datos ya ordenados o datos casi ordenados – estos son comunes en datos del mundo real, y pueden ser ordenados en tiempo O(n) por algoritmos apropiados., Finalmente, también pueden ser inestables, y la estabilidad es a menudo una propiedad deseable en un tipo. Por lo tanto, a menudo se emplean algoritmos más sofisticados, como Timsort (basado en merge sort) o introsort (basado en quicksort, regresando a heap sort).

merge sortEdit

Artículo principal: merge sort

Merge sort aprovecha la facilidad de fusionar listas ya ordenadas en una nueva lista ordenada. Comienza comparando cada dos elementos (es decir, 1 con 2, luego 3 con 4…) e intercambiarlos si el primero viene después del segundo., Luego fusiona cada una de las listas resultantes de dos en listas de cuatro, luego fusiona esas listas de cuatro, y así sucesivamente; hasta que por fin dos listas se fusionan en la lista ordenada final. De los algoritmos descritos aquí, este es el primero que escala bien a listas muy grandes, porque su peor tiempo de ejecución es O (n log n). También se aplica fácilmente a listas, no solo arrays, ya que solo requiere acceso secuencial, no Acceso Aleatorio. Sin embargo, tiene una complejidad adicional de espacio O(n), e implica un gran número de copias en implementaciones simples.,

Merge sort ha visto un aumento relativamente reciente en popularidad para implementaciones prácticas, debido a su uso en el sofisticado algoritmo Timsort, que se utiliza para la rutina de Ordenación estándar en los lenguajes de programación Python y Java (a partir de JDK7). Merge sort en sí es la rutina estándar en Perl, entre otros, y se ha utilizado en Java al menos desde 2000 en JDK1.3.

HeapsortEdit

Artículo principal: Heapsort

Heapsort es una versión mucho más eficiente de selection sort., También funciona determinando el elemento más grande (o más pequeño) de la lista, colocándolo al final (o al principio) de la lista, luego continuando con el resto de la lista, pero logra esta tarea eficientemente usando una estructura de datos llamada montón, un tipo especial de árbol binario. Una vez que la lista de datos se ha convertido en un montón, se garantiza que el nodo raíz sea el elemento más grande (o más pequeño). Cuando se elimina y se coloca al final de la lista, el montón se reorganiza para que el elemento más grande restante se mueva a la raíz., Usando el montón, encontrar el siguiente elemento más grande toma O (log n) tiempo, en lugar de O(n) para un escaneo lineal como en la clasificación de selección simple. Esto permite que Heapsort se ejecute en tiempo o (n log n), y esta es también la peor complejidad de los casos.

QuicksortEdit

Artículo principal: Quicksort

Quicksort es un algoritmo de dividir y conquistar que se basa en una operación de partición: para particionar una matriz, se selecciona un elemento llamado pivote. Todos los elementos más pequeños que el pivote se mueven antes de él y todos los elementos mayores se mueven después de él. Esto se puede hacer de manera eficiente en tiempo lineal y en el lugar., Las sublistas menor y mayor se ordenan recursivamente. Esto produce una complejidad de tiempo promedio de O (N log n), con baja sobrecarga, y por lo tanto este es un algoritmo popular. Las implementaciones eficientes de quicksort (con particiones en el lugar) son típicamente clases inestables y algo complejas, pero se encuentran entre los Algoritmos de ordenación más rápidos en la práctica. Junto con su modesto uso de espacio o(log n), quicksort es uno de los Algoritmos de ordenación más populares y está disponible en muchas bibliotecas de programación estándar.,

la advertencia importante sobre quicksort es que su peor rendimiento es O (n2); mientras que esto es raro, en implementaciones ingenuas (elegir el primer o el último elemento como pivote) esto ocurre para los datos ordenados, que es un caso común. El problema más complejo en quicksort es elegir un buen elemento de pivote, ya que las elecciones consistentemente pobres de pivotes pueden resultar en un rendimiento o(n2) drásticamente más lento, pero una buena elección de pivotes produce un rendimiento O(n log n), que es asintóticamente óptimo. Por ejemplo, si en cada paso se elige la mediana como pivote, entonces el algoritmo funciona en O (N log n)., Encontrar la mediana, como por la mediana del algoritmo de selección de medianas es, sin embargo, una operación O (n) en listas no clasificadas y, por lo tanto, exige una sobrecarga significativa con la ordenación. En la práctica, la elección de un pivote Aleatorio casi con certeza produce un rendimiento O (n log n).

ShellsortEdit

un tipo de Shell, diferente del tipo de burbuja en que mueve elementos a numerosas posiciones de intercambio.

Artículo principal: Shell sort

Shellsort fue inventado por Donald Shell en 1959., Mejora la clasificación por inserción al mover elementos fuera de orden más de una posición a la vez. El concepto detrás de Shellsort es que el tipo de inserción se realiza en O(k n ) {\displaystyle o (kn)} tiempo, donde k es la mayor distancia entre dos elementos fuera de lugar. Esto significa que, en general, funcionan en O (n2), pero para los datos que en su mayoría están ordenados, con solo unos pocos elementos fuera de lugar, funcionan más rápido. Por lo tanto, al ordenar primero los elementos lejos, y reducir progresivamente la brecha entre los elementos a ordenar, la clasificación final calcula mucho más rápido., Una implementación se puede describir como organizar la secuencia de datos en una matriz bidimensional y luego ordenar las columnas de la matriz utilizando la ordenación por inserción.

la complejidad temporal en el peor de los casos de Shellsort es un problema abierto y depende de la secuencia de intervalos utilizada, con complejidades conocidas que van desde O(n2) a O(n4/3) y Θ(n log2 n)., Esto, combinado con el hecho de que Shellsort está en su lugar, solo necesita una cantidad relativamente pequeña de código, y no requiere el uso de la pila de llamadas, lo que hace que sea útil en situaciones donde la memoria está en una prima, como en sistemas embebidos y kernels de sistemas operativos.

Bubble sort and variantsEdit

esta sección no cita ninguna fuente. Por favor, ayude a mejorar esta sección agregando citas a fuentes confiables. El material sin recursos puede ser impugnado y eliminado., (Mayo de 2019) (Aprenda cómo y cuándo eliminar este mensaje de plantilla)

El tipo de burbuja y las variantes como el tipo de shell y el tipo de cóctel son algoritmos de Ordenación simples y altamente ineficientes. Se ven con frecuencia en los textos introductorios debido a la facilidad de análisis, pero rara vez se utilizan en la práctica.

Bubble sortEdit

un tipo de orden de burbuja, un algoritmo de ordenación que recorre continuamente una lista, intercambiando elementos hasta que aparecen en el orden correcto.,

Artículo principal: Bubble sort

Bubble sort es un algoritmo de clasificación simple. El algoritmo comienza al principio del conjunto de datos. Compara los dos primeros elementos, y si el primero es mayor que el segundo, los intercambia. Continúa haciendo esto para cada par de elementos adyacentes al final del conjunto de datos. Luego comienza de nuevo con los dos primeros elementos, repitiéndose hasta que no se hayan producido cambios en la última pasada. El tiempo promedio de este algoritmo y el rendimiento en el peor de los casos es O(n2), por lo que rara vez se usa para ordenar conjuntos de datos grandes y desordenados., La ordenación de burbujas se puede usar para ordenar un pequeño número de elementos (donde su ineficiencia asintótica no es una penalización alta). La ordenación de burbujas también se puede usar de manera eficiente en una lista de cualquier longitud que esté casi ordenada (es decir, los elementos no están significativamente fuera de lugar). Por ejemplo, si cualquier número de elementos están fuera de lugar en una sola posición (por ejemplo, 0123546789 y 1032547698), el intercambio de bubble sort los ordenará en la primera pasada, la segunda pasada encontrará todos los elementos en orden, por lo que la ordenación tomará solo 2n tiempo.,

comb sortEdit

Artículo principal: Comb sort

Comb sort es un algoritmo de clasificación relativamente simple basado en bubble sort y diseñado originalmente por Włodzimierz Dobosiewicz en 1980. Más tarde fue redescubierto y popularizado por Stephen Lacey y Richard Box con un artículo de la revista Byte publicado en abril de 1991. La idea básica es eliminar las tortugas, o valores pequeños cerca del final de la lista, ya que en una clasificación de burbujas estos ralentizan enormemente la clasificación., (Los conejos, los valores grandes alrededor del principio de la lista, no plantean un problema en la ordenación de burbujas) esto se logra al intercambiar inicialmente elementos que están a cierta distancia entre sí en la matriz, en lugar de solo intercambiar elementos si están adyacentes entre sí, y luego reducir la distancia elegida hasta que funcione como una ordenación de burbujas normal. Por lo tanto, si Shellsort se puede pensar como una versión generalizada de ordenación por inserción que intercambia elementos espaciados a cierta distancia unos de otros, la ordenación por peine se puede pensar como la misma generalización aplicada a la ordenación por burbujas.,

distribution sortEdit

ver también: External sorting

Distribution sort se refiere a cualquier algoritmo de clasificación donde los datos se distribuyen desde su entrada a múltiples estructuras intermedias que luego se recopilan y colocan en la salida. Por ejemplo, tanto bucket sort como flashsort son algoritmos de Ordenación basados en distribución. Los Algoritmos de clasificación de distribución se pueden usar en un solo procesador, o pueden ser un algoritmo distribuido, donde los subconjuntos individuales se ordenan por separado en diferentes procesadores, y luego se combinan., Esto permite la clasificación externa de datos demasiado grandes para caber en la memoria de una sola computadora.

Counting sortEdit

Artículo principal: Counting sort

Counting sort es aplicable cuando se sabe que cada entrada pertenece a un conjunto particular, S, de posibilidades. El algoritmo se ejecuta en tiempo O(|S| + N) y memoria o(|S/) donde n es la longitud de la entrada. Funciona creando una matriz entera de Tamaño / S / y usando la Ith bin para contar las ocurrencias del Ith miembro de S en la entrada. Cada entrada se cuenta incrementando el valor de su bin correspondiente., Después, la matriz de conteo se coloca en bucle para organizar todas las entradas en orden. Este algoritmo de clasificación a menudo no se puede usar porque S necesita ser razonablemente pequeño para que el algoritmo sea eficiente, pero es extremadamente rápido y demuestra un gran comportamiento asintótico a medida que aumenta n. También se puede modificar para proporcionar un comportamiento estable.

Bucket sortEdit

Artículo principal: Bucket sort

Bucket sort es un algoritmo de clasificación de divide y vencerás que generaliza el conteo de orden dividiendo una matriz en un número finito de Bucks., Cada cubo se clasifica individualmente, ya sea utilizando un algoritmo de clasificación diferente, o mediante la aplicación recursiva del algoritmo de clasificación del cubo.

una ordenación de bucket funciona mejor cuando los elementos del conjunto de datos se distribuyen uniformemente entre todos los Bucks.

Radix sortEdit

Artículo principal: Radix sort

Radix sort es un algoritmo que ordena números procesando dígitos individuales. n números que consisten en K dígitos cada uno se ordenan en tiempo O · n * k)., Radix sort puede procesar dígitos de cada número a partir del dígito menos significativo (LSD) o a partir del dígito más significativo (MSD). El algoritmo LSD primero ordena la lista por el dígito menos significativo mientras preserva su orden relativo usando una clasificación estable. Luego los ordena por el siguiente dígito, y así sucesivamente Del menos significativo al más significativo, terminando con una lista ordenada. Mientras que la ordenación LSD radix requiere el uso de una ordenación estable, el algoritmo de Ordenación MSD radix no lo hace (a menos que se desee una ordenación estable). In-place MSD radix sort no es estable., Es común que el algoritmo counting sort sea utilizado internamente por radix sort. Un enfoque de Ordenación híbrido, como el uso de ordenación por inserción para contenedores pequeños, mejora significativamente el rendimiento de la ordenación radix.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *