Comb sort
En ciencias de la computación, el comb sort (comb=peine) es un algoritmo de ordenamiento relativamente simple diseñado por Wlodzimierz Dobosiewicz en 1980. Posteriormente fue redescubierto y popularizado por Stephen Lacey y Richard Box en un artículo publicado por la revista Byte en abril de 1991. El algoritmo comb sort mejora el algoritmo de ordenamiento de burbuja y rivaliza en velocidad con algoritmos más complejos como el Quicksort. La idea básica es eliminar tortugas, o pequeños valores cerca del final de la lista, ya que en el algoritmo de ordenamiento de burbuja esto reduce la velocidad de ordenamiento tremendamente. (Los conejos, grandes valores alrededor del inicio de la lista, no plantean un problema en el algoritmo de ordenamiento de burbuja.)
En el ordenamiento de burbuja, cuando dos elementos cualquiera se comparan, siempren tienen un espacio (distancia entre ellos) de 1. La idea básica del algoritmo comb sort es que el espacio pueda ser mucho mayor de uno. El ordenamiento Shell también se basa en esta idea, pero es una modificación del algoritmo de ordenamiento por inserción más que del algoritmo de ordenamiento de burbuja.
El espacio se inicia como la longitud de la lista a ordenar dividida por el factor de encogimiento (generalmente 1,3; véase debajo), y la lista se ordena con este valor (redondeado a la baja a un entero si es necesario) para el espacio. Después el espacio se divide por el factor de encogimiento de nuevo, la lista se ordena con este nuevo espacio, y el proceso se repite hasta que el espacio es 1. En este momento, el algoritmo comb sort continua usando un espacio de 1 hasta que la lista está completamente ordenada. La etapa final del ordenamiento es así equivalente al algoritmo de ordenamiento de burbuja, pero en este momento la mayoría de las tortugas ya han sido tratadas, de manera que un algoritmo de ordenamiento de burbuja será eficiente.
Factor de encogimiento
El factor de encogimiento tiene un gran efecto en la eficiencia del algoritmo comb sort. En el artículo original, los autores sugierieron 1,3 después de probar algunas listas aleatorias y encontrarlo generalmente el más efectivo. Un valor muy pequeño reduce la velocidad del algoritmo porque se deben hacer más comparaciones, mientras que un valor demasiado grande puede que no elimine suficientes tortugas para que sea práctico.
El texto describe una mejora del algoritmo comb sort usando el valor base como factor de encogimiento. También contiene una implementación en pseudocódigo con unas tablas de espacios predefinidos.
Combsort11
Con un factor de encogimiento alrededor de 1,3, sólo hay tres posibles maneras de que la lista de espacios acabe: (9, 6, 4, 3, 2, 1), (10, 7, 5, 3, 2, 1), o (11, 8, 6, 4, 3, 2, 1). Sólo el último de estos dos finales mata todas las tortugas antes de que el espacio se convierta en 1. Por lo tanto, se pueden hacer mejoras significativas en la velocidad si el espacio se establece en 11 siempre que sea 9 o 10. A esta variación se le llama Combsort11.
Si se usa cualquiera de la secuencias que comienza por 9 o 10, el paso final con un espacio de 1 es menos probable que haya ordenado los datos completamente, necesitando otro paso con un espacio de 1. Los datos están ordenados cuando no se hacen intercambios durante un paso con espacio = 1.
Ejemplo en pseudocódigo del algoritmo combsort11
function combsort11(array input) gap:= input.size //inicializar tamaño de espacio loop until gap = 1 and swaps = 0 //actualizar el valor del espacio para el siguiente rastreo if gap > 1 gap:= gap / 1.3 if gap = 10 or gap = 9 gap:= 11 end if end if
i:= 0 swaps:= 0 //véase ordenamiento de burbuja para una explicación //un único "rastreo" sobre la lista de entrada loop until i + gap >= array.size if array[i] > array[i+gap] swap (array[i], array[i+gap]) swaps:= swaps + 1 end if i:= i + 1 end loop end loop end function
Véase también
- Ordenamiento de burbuja, un algoritmo generalmente más lento, es la base del algoritmo comb sort.
- Cocktail sort, un ordenamiento de burbuja bidireccional, es una variación del ordenamiento de burbuja que también trata el problema de las tortugas.