SlideShare una empresa de Scribd logo
1 de 11
Descargar para leer sin conexión
Estudio y optimización del algoritmo de
ordenamiento Shellsort
Benjamin Bustos
Departamento de Ciencias de la Computación, Universidad de Chile
bebustos@dcc.uchile.cl
Resumen
Este estudio analiza, en forma empírica, el desempeño del algoritmo de ordenamiento Shellsort
con diferentes series de pasos. Se estudian optimizaciones al algoritmo para evitar los peores casos y se
compara su rendimiento con algoritmos de ordenamiento eficientes (Quicksort, Mergesort y Heapsort),
discutiéndose la utilidad del algoritmo para resolver el problema de ordenamiento de conjuntos de
tamaño medio.
1. Introducción
El estudio de algoritmos de ordenamiento tiene una gran importancia dentro de la Ciencia de la
Computación, pues una buena cantidad de los procesos realizados por medios computacionales requieren
que sus datos estén ordenados. Además, el hecho de almacenar los datos de manera ordenada permite
implementar algoritmos de búsqueda muy rápidos (por ejemplo: búsqueda binaria). Esta y muchas otras
razones de fin práctico impulsaron el estudio y la búsqueda de algoritmos de ordenamiento eficientes.
Desde los comienzos del uso de computadores se conocían algoritmos que resolvían el problema
en tiempo cuadrático respecto del tamaño del problema, pero eran rutinas muy sencillas y lentas. El
algoritmo de ordenamiento Shellsort fue publicado en 1959 por Donald L. Shell, y fue uno de los
primeros en romper la barrera del orden cuadrático, aunque esto en realidad se probó un par de años
después de su publicación.
El objetivo de este estudio es demostrar empíricamente que implementar Shellsort con series de
pasos dependientes del tamaño del arreglo puede llegar a ser mucho más eficiente que con las series
clásicas, las cuales son independientes del tamaño del arreglo, pero hay que aplicar una optimización
sencilla para obtener buenos resultados: todos los pasos de la serie deben ser números impares. Además,
este estudio muestra que dada la simplicidad de programación del algoritmo, su buen peor caso y caso
promedio, y su ejecución “in place”, es decir, no necesita espacio adicional para realizar el ordenamiento
del arreglo, lo hacen un buen candidato para resolver el problema de ordenamiento cuando la cantidad de
elementos a ordenar no es muy grande (menos de 100.000 elementos).
2. Descripción del algoritmo de ordenamiento Shellsort
El problema consiste esencialmente en ordenar un número finito de elementos en un tiempo
razonable. Para estos efectos, diremos que cada elemento ocupa una celda dentro de un arreglo
previamente definido. Shellsort trabaja mediante una serie de iteraciones, utilizando un algoritmo de
ordenación simple (Insert Sort) entre elementos que se encuentran a determinada distancia dentro del
arreglo, distancia que disminuye a medida que avanzamos en iteraciones, con lo que la última iteración
corresponde al algoritmo de ordenación tradicional de Insert Sort (cuando la distancia es 1).
En primer lugar analicemos el algoritmo de Insert Sort utilizando pseudocódigo:
for j 2 to n do
KEY L[j]; i j – 1
while i>0 and L[i]>KEY do
L[i+1] L[i]; i i – 1
end
L[i+1] KEY
end
donde n corresponde al número total de elementos a ordenar y L es originalmente el arreglo desordenado.
El algoritmo actúa tomando cada elemento desde el segundo en adelante, y se va intercambiando con los
elementos anteriores a él mientras encuentre que el elemento a su izquierda en el arreglo es mayor que él.
De esta forma, cuando vamos a comparar el elemento i-esimo, todos los elementos anteriores (hasta el
(i-1)ésimo) se encuentran ya ordenados. Cuando termina la ejecución, L presenta los n elementos
ordenados de menor a mayor. Se puede demostrar que el tiempo promedio que demora el algoritmo Insert
Sort en ordenar un arreglo es de )( 2
nO , y que el algoritmo es muy rápido si el arreglo está semi-
ordenado. En particular, si el arreglo está ordenado el algoritmo de inserción demora )(nO .
El algoritmo de Shellsort actúa de manera similar, pero entre elementos separados a una
distancia que va disminuyendo en cada iteración. Lo que obtenemos con esto es que cuando se emplee el
algoritmo tradicional de Insert Sort, los elementos ya están ordenados relativamente, y así la cantidad de
comparaciones que tiene que hacer es mucho menor. Eligiendo las distancias adecuadas, el algoritmo de
Shellsort presenta un mejor orden promedio que Insert Sort.
A continuación se presenta el algoritmo de Shellsort en pseudocódigo:
for s t to 1 by – 1 {s es el índice del incremento o distancia}
h dist[s] {h es el incremento o distancia entre elementos a comparar}
for j h + 1 to n {j empieza en el segundo elemento del arreglo original}
KEY L[j]; i j – h
while i>0 and L[i]>KEY do
L[i + h] L[i]; i j – h
end
L[i + h] KEY
end
end
donde t corresponde al número de iteraciones, dist es un arreglo que contiene la distancia entre elementos
a comparar para cada iteración (la primera en el arreglo siempre es igual a 1 y corresponde a la última
distancia ocupada por el algoritmo, momento en el cual es equivalente a Insert Sort), n es el número de
elementos a ordenar y L es originalmente el arreglo desordenado. Luego de su ejecución, en L están
ordenados los n elementos de menor a mayor.
Para que esto quede más claro conviene ilustrar el problema y su solución con el siguiente
ejemplo:
La razón para usar el método de inserción para ordenar los subarreglos de las etapas sucesivas de
Shellsort, es por su sencillez y por el hecho que el trabajo realizado en etapas previas se mantiene al
ordenar la etapa actual. En efecto, si se define como arreglo t-ordenado aquel en el cual los elementos
que se encuentran a distancia t, dentro del arreglo, están ordenados, se puede demostrar que si un arreglo
h-ordenado es transformado a k-ordenado (con k<h), se mantiene h-ordenado,. Esto permite que a
medida que el paso se va haciendo más pequeño, los elementos ya están bastante ordenados globalmente
y al realizar la última etapa con paso h=1 (que es una ordenación por Inserción), prácticamente se lleva a
cabo en una sola pasada ( )(nO ), dado todo el trabajo realizado en las iteraciones previas. Este algoritmo
es un claro ejemplo de como una pequeña modificación a un algoritmo lento lo puede convertir en uno
bastante más rápido.
El número de comparaciones efectuado por Shellsort es una función de las secuencias de
incremento o distancias que utiliza. Su análisis es extremadamente difícil y requiere respuestas a varios
problemas matemáticos todavía no resueltos. Por lo tanto, la mejor secuencia posible de incrementos aún
no ha sido determinada, aunque algunos casos específicos han sido estudiados. Por ejemplo, para la serie
3
2 72.1 nh = y 11 =h se ha demostrado que el tiempo de ejecución es )( 3
5
nO , lo que puede parecer
sorprendente: haciendo una sola pasada previa se mejora el algoritmo de inserción que en promedio es
)( 2
nO .
Las serie de pasos almacenados en el arreglo dist tiene la característica de ser independiente del
tamaño del arreglo al cual se aplica durante el desarrollo del algoritmo, por lo que sus valores pueden ser
pre-calculados antes de ejecutar el ordenamiento. En general, al programar el algoritmo esto no es así, y
los valores de los pasos se calculan cada vez que una iteración termina, lo cual no influye en nada en la
eficiencia del algoritmo: durante las pruebas realizadas en el estudio, las diferencias de tiempo entre tener
pre-calculados los pasos e irlos calculando en cada iteración no superaron el margen de error de las
pruebas (menos del 0.01% del tiempo promedio obtenido).
Sin perjuicio de lo anterior, existen otras series de pasos que son dependientes del tamaño del
arreglo al cual se aplican, como por ejemplo 





= +
2
1i
i
h
h , partiendo con nht = y terminando cuando
11 =h . El comportamiento de ésta serie no es muy diferente a la de
1
2 −
= i
ih , pero si se cambia el
factor de división 2 por uno ligeramente superior, digamos 2.2, el algoritmo se acelera notablemente. En
la literatura se recomienda no utilizar este tipo de series, pues si antes el análisis matemático era muy
complicado, con este tipo de series dependientes es imposible realizarlo. Sin embargo, este estudio
demuestra empíricamente que algunas series de este tipo pueden llegar a ser muy eficientes si se le aplica
al algoritmo una pequeña optimización, la cual se analiza a continuación.
3. Evitando el peor caso
Durante el desarrollo del estudio se probó el rendimiento de la siguiente serie: 





= +
4.2
1i
i
h
h ,
partiendo con 





=
8.4
n
ht y terminando cuando 11 =h . Para esto, se generaron arreglos con elementos
al azar, partiendo desde un tamaño de 100 hasta un tamaño de 100.000 y agregando 100 elementos en
cada iteración del experimento (¡un test bastante exhaustivo!). El algoritmo funcionaba bastante bien,
pero resaltaron dos problemas: las diferencias en el tiempo utilizado entre cantidades de elementos muy
similares eran grandes, y el algoritmo se comportaba estrepitosamente mal con arreglos de exactamente
64.700 elementos (un orden de magnitud de diferencia con respecto a arreglos de 64.600 y 64.800
elementos), lo cual era bastante extraño. La raíz del problema radicaba, curiosamente, en los mismos
inicios del algoritmo:
Se ha demostrado que el peor caso de Shellsort ocupando los incrementos de Shell, es decir
1
2 −
= i
ih (h es potencia de 2), ejecuta un número de comparaciones )( 2
nO , si los elementos están
distribuidos originalmente en el arreglo de tal manera que la mitad mayor se encuentre en celdas pares y
la mitad menor en celdas impares. Dado que todos los incrementos son pares exceptuando el último,
cuando se ha llegado a la última iteración, con el único incremento impar igual a 1, continúan estando
todos los elementos mayores en las celdas pares y los menores en las celdas impares. De este modo en el
último paso (equivalente al algoritmo de Insert Sort) se deben realizar una gran cantidad de
comparaciones (recordemos que Insert Sort es, en promedio, )( 2
nO ).
Efectivamente esto era lo que ocurría con la serie de pasos estudiada. Todas las aproximaciones
de 





= +
4.2
1i
i
h
h partiendo con 





=
8.4
700.64
th dan números pares (y es el único valor entre 100 y
100.000, múltiplos de 100, en el que ocurre este fenómeno), con lo que el último paso, igual a un Insert
Sort, debía realizar una gran cantidad de trabajo al no haberse comparado nunca las posiciones impares
del arreglo con las pares, lo que degradaba notablemente el rendimiento del algoritmo.
Realizando la pequeña optimización de restarle uno al paso si éste resulta par, se obtiene un
algoritmo mucho más homogéneo y eficiente en su comportamiento. La aplicación de esta optimización
debiera realizarse a todas las series de pasos, sean éstas dependientes del tamaño del arreglo o no.
4. Comparación del rendimiento de distintas series de pasos
Las series implementadas para realizar el estudio (y que fueron pre-seleccionadas por ser las más
eficientes), son las siguientes:
1. 1*3 1 += −ii hh (h = 1, 4, 13, 40, 121, 364, 1093, …), en donde el paso mayor es el número de la
serie más cercano a 





9
n
.
2. 12 −= i
ih , en donde el paso mayor es el número de la serie más cercano a n .
3.
2
13 −
=
i
ih , en donde el paso mayor es el número de la serie que se encuentra dos posiciones antes
del más cercano a n .
4. 





= +
k
h
h i
i
1
(restándole 1 si ih resulta par), donde: (a) =k 2.2, (b) =k 2.4, y el paso mayor es






=
k
n
ht
*2
.
Se generaron arreglos de números enteros con valores aleatorios, cuya cantidad de elementos
varió entre los 10.000 y 100.000 elementos (múltiplos de 5.000). Cada iteración del test consistió en
repetir 30 veces el algoritmo con arreglos distintos pero con la misma cantidad de elementos, calculando
luego el tiempo promedio que tomaba el algoritmo en ordenar el arreglo. Para verificar la validez de los
datos, se calculó el intervalo de confianza I en el cual se encontraría la media real de los tiempos
obtenidos, con un nivel de confianza del 95%:
]262.2*,262.2*[ 11
n
S
X
n
S
XI n
n
n
n
−−
+−= , 30=n para cada iteración.
∑=
=
n
i
in X
n
X
1
*
1
(media empírica)
2
1
2
1 )(*
1
1
n
n
i
in XX
n
S −
−
= ∑=
− (varianza empírica)
El test fue realizado en un PC con procesador Pentium 200 MMX y sistema operativo Linux
(kernel 2.0.34). Los algoritmos fueron implementados en lenguaje C.
Los resultados obtenidos se muestran en el siguiente gráfico:
Los puntos representan el tiempo promedio obtenido por cada algoritmo. Los intervalos de
confianza calculados poseen un ancho promedio del 2% del tiempo promedio obtenido, por lo que dichos
tiempos se acercan bastante a la media real.
Se observa en el gráfico que las series dependientes del tamaño del arreglo superan ampliamente
a la mejor serie independiente del arreglo. En particular, la serie de pasos 





= +
2.2
1i
i
h
h reduce en un 24%
el tiempo de la mejor serie clásica ( 1*3 1 += −ii hh ) en arreglos con 100.000 elementos. La curva que
Comparación entre series de Shellsort
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
0 20000 40000 60000 80000 100000 120000
Nº de elementos
Tiempo[seg]
Serie 1
Serie 2
Serie 3
Serie 4a
Serie 4b
mejor aproxima a los datos obtenidos utilizando esta serie es
1283644,16239043.13
* XeY −
= , es decir, el
tiempo promedio que toma el algoritmo en ordenar es de )( 8
9
nO aproximadamente.
Se realizó el mismo test pero ahora comparando Quicksort, Mergesort y Heapsort con la mejor
serie de Shellsort, 





= +
2.2
1i
i
h
h . El resultado obtenido fue el siguiente:
Cabe destacar que Mergesort se demora lo mismo en ordenar un arreglo desordenado de 10.000
elementos que Shellsort, pero éste no ocupa espacio extra para realizar el ordenamiento. Quicksort sigue
siendo el algoritmo más eficiente, pero hasta los 100.000 Shellsort sólo toma el doble de tiempo que
Quicksort para ordenar el arreglo.
Comparación de Shellsort con algoritmos de
ordenamiento eficientes
0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0 50000 100000 150000
Nº de elementos
Tiempo[seg]
Shellsort
Quicksort
Mergesort
Heapsort
Resumiendo: para arreglos de menos de 100.000 elementos Shellsort se comporta mejor que
Heapsort, que tiene complejidad en tiempo ))ln(*( nnO y opera "in place"; Mergesort se comporta un
poco mejor que Shellsort en tiempo de ejecución, pero tiene la desventaja que no trabaja "in place";
Quicksort se comporta mucho mejor que Shellsort y también opera "in place", pero tiene la desventaja de
tener un peor caso )( 2
nO .
5. Conclusiones
Si bien Shellsort no es el algoritmo más eficiente para ordenar arreglos, comparado con la
complejidad ))ln(*( nnO de los algoritmos Quicksort, Mergesort y Heapsort, es un algoritmo mucho
más fácil de programar. Su simplicidad radica en que deriva del algoritmo más simple para ordenar, Insert
Sort. Además, su complejidad promedio en tiempo de )( 8
9
nO ocupando la serie 





= +
2.2
1i
i
h
h , y su
complejidad en espacio de )(nO , debido a que opera “in place”, lo hacen un buen candidato para
resolver el problema de ordenamiento en conjuntos de menos de 100.000 elementos.
Es vital para la eficiencia del algoritmo que todos los elementos de la serie de pasos sean
números impares, para lo cual basta con restarle 1 al paso si éste es par. Con esta pequeña modificación se
reduce el tiempo promedio de ejecución y su varianza. Además, el estudio demuestra empíricamente que
algunas series dependientes del tamaño del arreglo reducen el tiempo de ejecución del algoritmo con
respecto a las series clásicas. Sin embargo, aún no se sabe con certeza cuál es la eficiencia real del
algoritmo, y es muy posible que existan series de pasos que reduzcan los tiempos de ejecución obtenidos
en los tests descritos.
6. Referencias
• Mark Allen Weiss, Data Structures and Algorithm Analysis, Benjamin/Cummings, 2ª ed., 1995, pág.
216-220.
• Micha Hofri, Analysis of Algorithms: Computational Methods and Mathematical Tools, Oxford
University Press, 1995, pág. 431-437.
• Robert Sedgewick, Algorithms in C++, Addison-Wesley, 1992, pág. 107-112.
• Sara Baase, Computer Algorithms: Introduction to Design and Analysis, Addison-Wesley, 1978, pág.
73-76.

Más contenido relacionado

La actualidad más candente (18)

Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 
Ordenamiento en C++
Ordenamiento en C++Ordenamiento en C++
Ordenamiento en C++
 
Metodos De Ordenamiento
Metodos De OrdenamientoMetodos De Ordenamiento
Metodos De Ordenamiento
 
Informe ordenamiento
Informe ordenamientoInforme ordenamiento
Informe ordenamiento
 
Ordenamiento ppt
Ordenamiento pptOrdenamiento ppt
Ordenamiento ppt
 
METODOS DE ORDENAMIENTO
METODOS DE ORDENAMIENTOMETODOS DE ORDENAMIENTO
METODOS DE ORDENAMIENTO
 
Teoría De La Complejidad Algoritmica
Teoría De La Complejidad AlgoritmicaTeoría De La Complejidad Algoritmica
Teoría De La Complejidad Algoritmica
 
Complejidad de Algoritmos
Complejidad de AlgoritmosComplejidad de Algoritmos
Complejidad de Algoritmos
 
Metodos de ordenamiento
Metodos de ordenamientoMetodos de ordenamiento
Metodos de ordenamiento
 
1_Metodos.doc
1_Metodos.doc1_Metodos.doc
1_Metodos.doc
 
Estructura de Datos - Unidad 5 metodos de ordenamiento
Estructura de Datos - Unidad 5 metodos de ordenamientoEstructura de Datos - Unidad 5 metodos de ordenamiento
Estructura de Datos - Unidad 5 metodos de ordenamiento
 
Ordenamiento shell
Ordenamiento shellOrdenamiento shell
Ordenamiento shell
 
Exposicion Estructuras
Exposicion EstructurasExposicion Estructuras
Exposicion Estructuras
 
Complejidad de Algoritmos
Complejidad de AlgoritmosComplejidad de Algoritmos
Complejidad de Algoritmos
 
Tema5
Tema5Tema5
Tema5
 
Algoritmo por seleccion
Algoritmo por seleccionAlgoritmo por seleccion
Algoritmo por seleccion
 
Informe insercion
Informe insercionInforme insercion
Informe insercion
 
Ordenamiento Simple
Ordenamiento SimpleOrdenamiento Simple
Ordenamiento Simple
 

Similar a Bus99

Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretasFrancisco Lambert Obediente
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestroFrancisco Lambert Obediente
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenaciónvictdiazm
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenaciónBeat Winehouse
 
Ordenamientos de vectores
Ordenamientos de vectoresOrdenamientos de vectores
Ordenamientos de vectoressirekarol
 
metodos-de-ordenamiento.pdf
metodos-de-ordenamiento.pdfmetodos-de-ordenamiento.pdf
metodos-de-ordenamiento.pdfjorgeulises3
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenaciónIgnacio Reyes
 
Metodos de odenamiento de vctores
Metodos de odenamiento de vctoresMetodos de odenamiento de vctores
Metodos de odenamiento de vctoresmishuhot
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busquedaOsirysRock
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busquedaIrvingMoran4
 
Clasificacion de los problemas
Clasificacion de los problemasClasificacion de los problemas
Clasificacion de los problemasSergio Ormeño
 
Análisis de algoritmo
Análisis de algoritmoAnálisis de algoritmo
Análisis de algoritmoGaston Demundo
 
Algoritmo metodo quicksort
Algoritmo metodo quicksortAlgoritmo metodo quicksort
Algoritmo metodo quicksortPatricia Correa
 
Analisis busqueda binaria y secuencia
Analisis busqueda binaria y secuencia Analisis busqueda binaria y secuencia
Analisis busqueda binaria y secuencia Jose Rios
 
Analisis busquedas !
Analisis busquedas !Analisis busquedas !
Analisis busquedas !Jose Rios
 
Inf 2316(proyecto)
Inf 2316(proyecto)Inf 2316(proyecto)
Inf 2316(proyecto)jair_fni
 
Unidad 7 análisis de los algoritmos
Unidad 7 análisis de los algoritmosUnidad 7 análisis de los algoritmos
Unidad 7 análisis de los algoritmosUrban Skate House
 

Similar a Bus99 (20)

Jflambert lyada - ayudantia matematicas discretas
Jflambert   lyada - ayudantia matematicas discretasJflambert   lyada - ayudantia matematicas discretas
Jflambert lyada - ayudantia matematicas discretas
 
Jflambert lyada - ayudantia ordenamiento y teo maestro
Jflambert   lyada - ayudantia ordenamiento y teo maestroJflambert   lyada - ayudantia ordenamiento y teo maestro
Jflambert lyada - ayudantia ordenamiento y teo maestro
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenación
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenación
 
Ordenamientos de vectores
Ordenamientos de vectoresOrdenamientos de vectores
Ordenamientos de vectores
 
metodos-de-ordenamiento.pdf
metodos-de-ordenamiento.pdfmetodos-de-ordenamiento.pdf
metodos-de-ordenamiento.pdf
 
Algoritmos de ordenación
Algoritmos de ordenaciónAlgoritmos de ordenación
Algoritmos de ordenación
 
Metodos de odenamiento de vctores
Metodos de odenamiento de vctoresMetodos de odenamiento de vctores
Metodos de odenamiento de vctores
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busqueda
 
Ordenacion y busqueda
Ordenacion y busquedaOrdenacion y busqueda
Ordenacion y busqueda
 
Clasificacion de los problemas
Clasificacion de los problemasClasificacion de los problemas
Clasificacion de los problemas
 
Análisis de algoritmo
Análisis de algoritmoAnálisis de algoritmo
Análisis de algoritmo
 
Algoritmo metodo quicksort
Algoritmo metodo quicksortAlgoritmo metodo quicksort
Algoritmo metodo quicksort
 
Presentacion
PresentacionPresentacion
Presentacion
 
Analisis busqueda binaria y secuencia
Analisis busqueda binaria y secuencia Analisis busqueda binaria y secuencia
Analisis busqueda binaria y secuencia
 
Analisis busquedas !
Analisis busquedas !Analisis busquedas !
Analisis busquedas !
 
Inf 2316(proyecto)
Inf 2316(proyecto)Inf 2316(proyecto)
Inf 2316(proyecto)
 
Informe ordenamiento
Informe ordenamientoInforme ordenamiento
Informe ordenamiento
 
Unidad 7 análisis de los algoritmos
Unidad 7 análisis de los algoritmosUnidad 7 análisis de los algoritmos
Unidad 7 análisis de los algoritmos
 
S3-SCBC.pptx
S3-SCBC.pptxS3-SCBC.pptx
S3-SCBC.pptx
 

Último

propiedades y clasificacion de los materiales metalicos
propiedades y clasificacion de los materiales metalicospropiedades y clasificacion de los materiales metalicos
propiedades y clasificacion de los materiales metalicosOmarazahiSalinasLpez
 
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdf
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdfTEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdf
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdfrobertocarlosbaltaza
 
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Juan Carlos Fonseca Mata
 
CLASE 5 HOJA 2022.ppt botanica general 1
CLASE 5 HOJA 2022.ppt botanica general 1CLASE 5 HOJA 2022.ppt botanica general 1
CLASE 5 HOJA 2022.ppt botanica general 1jesusjja0210
 
Virus del dengue perú 2024 diagnostico,manejo,
Virus del dengue perú 2024 diagnostico,manejo,Virus del dengue perú 2024 diagnostico,manejo,
Virus del dengue perú 2024 diagnostico,manejo,KiaraIbaezParedes
 
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdfFowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdffrank0071
 
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptxllacza2004
 
fisilogia y anatomia del oido y el equilibrio
fisilogia y anatomia del oido y el equilibriofisilogia y anatomia del oido y el equilibrio
fisilogia y anatomia del oido y el equilibrioyanezevelyn0
 
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptx
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptxTEJIDOS HISTOLÓGICOS osteona, canal de haves.pptx
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptxmorajoe2109
 
fundamentos del mejoramiento genético en los animales
fundamentos del mejoramiento genético en los animalesfundamentos del mejoramiento genético en los animales
fundamentos del mejoramiento genético en los animalesJuanVillarreal79
 
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismo
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismoPIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismo
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismoArturoDavilaObando
 
Presentación digital Sobre ecosistemas, la selva
Presentación digital Sobre ecosistemas, la selvaPresentación digital Sobre ecosistemas, la selva
Presentación digital Sobre ecosistemas, la selvajesusvelazquez601
 
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...GloriaMeza12
 
FRACTURAS EXPUESTAS en niños y adolecentes.pdf
FRACTURAS EXPUESTAS en niños y adolecentes.pdfFRACTURAS EXPUESTAS en niños y adolecentes.pdf
FRACTURAS EXPUESTAS en niños y adolecentes.pdfhugohilasaca
 
Tractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médulaTractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la méduladianymorales5
 
Testimonio-de-segunda-revolucion-industrial.pdf
Testimonio-de-segunda-revolucion-industrial.pdfTestimonio-de-segunda-revolucion-industrial.pdf
Testimonio-de-segunda-revolucion-industrial.pdfd71229811u
 
EXPOSICION NORMA TECNICA DE SALUD 2024 -
EXPOSICION NORMA TECNICA DE SALUD 2024 -EXPOSICION NORMA TECNICA DE SALUD 2024 -
EXPOSICION NORMA TECNICA DE SALUD 2024 -FridaDesiredMenesesF
 
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUA
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUANEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUA
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUAcelixfabiolacaleropa
 
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.Ralvila5
 
Coherencia textual II Práctica dirigida h
Coherencia textual II Práctica dirigida hCoherencia textual II Práctica dirigida h
Coherencia textual II Práctica dirigida hSalomDB1
 

Último (20)

propiedades y clasificacion de los materiales metalicos
propiedades y clasificacion de los materiales metalicospropiedades y clasificacion de los materiales metalicos
propiedades y clasificacion de los materiales metalicos
 
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdf
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdfTEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdf
TEMA 4 TEORIAS SOBRE EL ORIGEN DE LA VIDA.pdf
 
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
 
CLASE 5 HOJA 2022.ppt botanica general 1
CLASE 5 HOJA 2022.ppt botanica general 1CLASE 5 HOJA 2022.ppt botanica general 1
CLASE 5 HOJA 2022.ppt botanica general 1
 
Virus del dengue perú 2024 diagnostico,manejo,
Virus del dengue perú 2024 diagnostico,manejo,Virus del dengue perú 2024 diagnostico,manejo,
Virus del dengue perú 2024 diagnostico,manejo,
 
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdfFowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
 
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx
5.1 INCREMENTO Y DIFERENCIACIÓN (3).pptx
 
fisilogia y anatomia del oido y el equilibrio
fisilogia y anatomia del oido y el equilibriofisilogia y anatomia del oido y el equilibrio
fisilogia y anatomia del oido y el equilibrio
 
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptx
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptxTEJIDOS HISTOLÓGICOS osteona, canal de haves.pptx
TEJIDOS HISTOLÓGICOS osteona, canal de haves.pptx
 
fundamentos del mejoramiento genético en los animales
fundamentos del mejoramiento genético en los animalesfundamentos del mejoramiento genético en los animales
fundamentos del mejoramiento genético en los animales
 
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismo
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismoPIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismo
PIZARRO-parte4.pdf apuntes de física 3, electricidad y magnetismo
 
Presentación digital Sobre ecosistemas, la selva
Presentación digital Sobre ecosistemas, la selvaPresentación digital Sobre ecosistemas, la selva
Presentación digital Sobre ecosistemas, la selva
 
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
 
FRACTURAS EXPUESTAS en niños y adolecentes.pdf
FRACTURAS EXPUESTAS en niños y adolecentes.pdfFRACTURAS EXPUESTAS en niños y adolecentes.pdf
FRACTURAS EXPUESTAS en niños y adolecentes.pdf
 
Tractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médulaTractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médula
 
Testimonio-de-segunda-revolucion-industrial.pdf
Testimonio-de-segunda-revolucion-industrial.pdfTestimonio-de-segunda-revolucion-industrial.pdf
Testimonio-de-segunda-revolucion-industrial.pdf
 
EXPOSICION NORMA TECNICA DE SALUD 2024 -
EXPOSICION NORMA TECNICA DE SALUD 2024 -EXPOSICION NORMA TECNICA DE SALUD 2024 -
EXPOSICION NORMA TECNICA DE SALUD 2024 -
 
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUA
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUANEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUA
NEMATODOS TISULARES-2020.pdf, DE LA UNAN MANAGUA
 
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.
Carbohidratos, lipidos, acidos nucleicos, y principios del metabolismo.
 
Coherencia textual II Práctica dirigida h
Coherencia textual II Práctica dirigida hCoherencia textual II Práctica dirigida h
Coherencia textual II Práctica dirigida h
 

Bus99

  • 1. Estudio y optimización del algoritmo de ordenamiento Shellsort Benjamin Bustos Departamento de Ciencias de la Computación, Universidad de Chile bebustos@dcc.uchile.cl Resumen Este estudio analiza, en forma empírica, el desempeño del algoritmo de ordenamiento Shellsort con diferentes series de pasos. Se estudian optimizaciones al algoritmo para evitar los peores casos y se compara su rendimiento con algoritmos de ordenamiento eficientes (Quicksort, Mergesort y Heapsort), discutiéndose la utilidad del algoritmo para resolver el problema de ordenamiento de conjuntos de tamaño medio. 1. Introducción El estudio de algoritmos de ordenamiento tiene una gran importancia dentro de la Ciencia de la Computación, pues una buena cantidad de los procesos realizados por medios computacionales requieren que sus datos estén ordenados. Además, el hecho de almacenar los datos de manera ordenada permite implementar algoritmos de búsqueda muy rápidos (por ejemplo: búsqueda binaria). Esta y muchas otras razones de fin práctico impulsaron el estudio y la búsqueda de algoritmos de ordenamiento eficientes. Desde los comienzos del uso de computadores se conocían algoritmos que resolvían el problema en tiempo cuadrático respecto del tamaño del problema, pero eran rutinas muy sencillas y lentas. El algoritmo de ordenamiento Shellsort fue publicado en 1959 por Donald L. Shell, y fue uno de los primeros en romper la barrera del orden cuadrático, aunque esto en realidad se probó un par de años después de su publicación. El objetivo de este estudio es demostrar empíricamente que implementar Shellsort con series de pasos dependientes del tamaño del arreglo puede llegar a ser mucho más eficiente que con las series clásicas, las cuales son independientes del tamaño del arreglo, pero hay que aplicar una optimización sencilla para obtener buenos resultados: todos los pasos de la serie deben ser números impares. Además,
  • 2. este estudio muestra que dada la simplicidad de programación del algoritmo, su buen peor caso y caso promedio, y su ejecución “in place”, es decir, no necesita espacio adicional para realizar el ordenamiento del arreglo, lo hacen un buen candidato para resolver el problema de ordenamiento cuando la cantidad de elementos a ordenar no es muy grande (menos de 100.000 elementos). 2. Descripción del algoritmo de ordenamiento Shellsort El problema consiste esencialmente en ordenar un número finito de elementos en un tiempo razonable. Para estos efectos, diremos que cada elemento ocupa una celda dentro de un arreglo previamente definido. Shellsort trabaja mediante una serie de iteraciones, utilizando un algoritmo de ordenación simple (Insert Sort) entre elementos que se encuentran a determinada distancia dentro del arreglo, distancia que disminuye a medida que avanzamos en iteraciones, con lo que la última iteración corresponde al algoritmo de ordenación tradicional de Insert Sort (cuando la distancia es 1). En primer lugar analicemos el algoritmo de Insert Sort utilizando pseudocódigo: for j 2 to n do KEY L[j]; i j – 1 while i>0 and L[i]>KEY do L[i+1] L[i]; i i – 1 end L[i+1] KEY end donde n corresponde al número total de elementos a ordenar y L es originalmente el arreglo desordenado. El algoritmo actúa tomando cada elemento desde el segundo en adelante, y se va intercambiando con los elementos anteriores a él mientras encuentre que el elemento a su izquierda en el arreglo es mayor que él. De esta forma, cuando vamos a comparar el elemento i-esimo, todos los elementos anteriores (hasta el (i-1)ésimo) se encuentran ya ordenados. Cuando termina la ejecución, L presenta los n elementos ordenados de menor a mayor. Se puede demostrar que el tiempo promedio que demora el algoritmo Insert
  • 3. Sort en ordenar un arreglo es de )( 2 nO , y que el algoritmo es muy rápido si el arreglo está semi- ordenado. En particular, si el arreglo está ordenado el algoritmo de inserción demora )(nO . El algoritmo de Shellsort actúa de manera similar, pero entre elementos separados a una distancia que va disminuyendo en cada iteración. Lo que obtenemos con esto es que cuando se emplee el algoritmo tradicional de Insert Sort, los elementos ya están ordenados relativamente, y así la cantidad de comparaciones que tiene que hacer es mucho menor. Eligiendo las distancias adecuadas, el algoritmo de Shellsort presenta un mejor orden promedio que Insert Sort. A continuación se presenta el algoritmo de Shellsort en pseudocódigo: for s t to 1 by – 1 {s es el índice del incremento o distancia} h dist[s] {h es el incremento o distancia entre elementos a comparar} for j h + 1 to n {j empieza en el segundo elemento del arreglo original} KEY L[j]; i j – h while i>0 and L[i]>KEY do L[i + h] L[i]; i j – h end L[i + h] KEY end end donde t corresponde al número de iteraciones, dist es un arreglo que contiene la distancia entre elementos a comparar para cada iteración (la primera en el arreglo siempre es igual a 1 y corresponde a la última distancia ocupada por el algoritmo, momento en el cual es equivalente a Insert Sort), n es el número de elementos a ordenar y L es originalmente el arreglo desordenado. Luego de su ejecución, en L están ordenados los n elementos de menor a mayor. Para que esto quede más claro conviene ilustrar el problema y su solución con el siguiente ejemplo:
  • 4. La razón para usar el método de inserción para ordenar los subarreglos de las etapas sucesivas de Shellsort, es por su sencillez y por el hecho que el trabajo realizado en etapas previas se mantiene al ordenar la etapa actual. En efecto, si se define como arreglo t-ordenado aquel en el cual los elementos que se encuentran a distancia t, dentro del arreglo, están ordenados, se puede demostrar que si un arreglo h-ordenado es transformado a k-ordenado (con k<h), se mantiene h-ordenado,. Esto permite que a medida que el paso se va haciendo más pequeño, los elementos ya están bastante ordenados globalmente y al realizar la última etapa con paso h=1 (que es una ordenación por Inserción), prácticamente se lleva a cabo en una sola pasada ( )(nO ), dado todo el trabajo realizado en las iteraciones previas. Este algoritmo es un claro ejemplo de como una pequeña modificación a un algoritmo lento lo puede convertir en uno bastante más rápido. El número de comparaciones efectuado por Shellsort es una función de las secuencias de incremento o distancias que utiliza. Su análisis es extremadamente difícil y requiere respuestas a varios problemas matemáticos todavía no resueltos. Por lo tanto, la mejor secuencia posible de incrementos aún no ha sido determinada, aunque algunos casos específicos han sido estudiados. Por ejemplo, para la serie
  • 5. 3 2 72.1 nh = y 11 =h se ha demostrado que el tiempo de ejecución es )( 3 5 nO , lo que puede parecer sorprendente: haciendo una sola pasada previa se mejora el algoritmo de inserción que en promedio es )( 2 nO . Las serie de pasos almacenados en el arreglo dist tiene la característica de ser independiente del tamaño del arreglo al cual se aplica durante el desarrollo del algoritmo, por lo que sus valores pueden ser pre-calculados antes de ejecutar el ordenamiento. En general, al programar el algoritmo esto no es así, y los valores de los pasos se calculan cada vez que una iteración termina, lo cual no influye en nada en la eficiencia del algoritmo: durante las pruebas realizadas en el estudio, las diferencias de tiempo entre tener pre-calculados los pasos e irlos calculando en cada iteración no superaron el margen de error de las pruebas (menos del 0.01% del tiempo promedio obtenido). Sin perjuicio de lo anterior, existen otras series de pasos que son dependientes del tamaño del arreglo al cual se aplican, como por ejemplo       = + 2 1i i h h , partiendo con nht = y terminando cuando 11 =h . El comportamiento de ésta serie no es muy diferente a la de 1 2 − = i ih , pero si se cambia el factor de división 2 por uno ligeramente superior, digamos 2.2, el algoritmo se acelera notablemente. En la literatura se recomienda no utilizar este tipo de series, pues si antes el análisis matemático era muy complicado, con este tipo de series dependientes es imposible realizarlo. Sin embargo, este estudio demuestra empíricamente que algunas series de este tipo pueden llegar a ser muy eficientes si se le aplica al algoritmo una pequeña optimización, la cual se analiza a continuación. 3. Evitando el peor caso Durante el desarrollo del estudio se probó el rendimiento de la siguiente serie:       = + 4.2 1i i h h , partiendo con       = 8.4 n ht y terminando cuando 11 =h . Para esto, se generaron arreglos con elementos
  • 6. al azar, partiendo desde un tamaño de 100 hasta un tamaño de 100.000 y agregando 100 elementos en cada iteración del experimento (¡un test bastante exhaustivo!). El algoritmo funcionaba bastante bien, pero resaltaron dos problemas: las diferencias en el tiempo utilizado entre cantidades de elementos muy similares eran grandes, y el algoritmo se comportaba estrepitosamente mal con arreglos de exactamente 64.700 elementos (un orden de magnitud de diferencia con respecto a arreglos de 64.600 y 64.800 elementos), lo cual era bastante extraño. La raíz del problema radicaba, curiosamente, en los mismos inicios del algoritmo: Se ha demostrado que el peor caso de Shellsort ocupando los incrementos de Shell, es decir 1 2 − = i ih (h es potencia de 2), ejecuta un número de comparaciones )( 2 nO , si los elementos están distribuidos originalmente en el arreglo de tal manera que la mitad mayor se encuentre en celdas pares y la mitad menor en celdas impares. Dado que todos los incrementos son pares exceptuando el último, cuando se ha llegado a la última iteración, con el único incremento impar igual a 1, continúan estando todos los elementos mayores en las celdas pares y los menores en las celdas impares. De este modo en el último paso (equivalente al algoritmo de Insert Sort) se deben realizar una gran cantidad de comparaciones (recordemos que Insert Sort es, en promedio, )( 2 nO ). Efectivamente esto era lo que ocurría con la serie de pasos estudiada. Todas las aproximaciones de       = + 4.2 1i i h h partiendo con       = 8.4 700.64 th dan números pares (y es el único valor entre 100 y 100.000, múltiplos de 100, en el que ocurre este fenómeno), con lo que el último paso, igual a un Insert Sort, debía realizar una gran cantidad de trabajo al no haberse comparado nunca las posiciones impares del arreglo con las pares, lo que degradaba notablemente el rendimiento del algoritmo. Realizando la pequeña optimización de restarle uno al paso si éste resulta par, se obtiene un algoritmo mucho más homogéneo y eficiente en su comportamiento. La aplicación de esta optimización debiera realizarse a todas las series de pasos, sean éstas dependientes del tamaño del arreglo o no.
  • 7. 4. Comparación del rendimiento de distintas series de pasos Las series implementadas para realizar el estudio (y que fueron pre-seleccionadas por ser las más eficientes), son las siguientes: 1. 1*3 1 += −ii hh (h = 1, 4, 13, 40, 121, 364, 1093, …), en donde el paso mayor es el número de la serie más cercano a       9 n . 2. 12 −= i ih , en donde el paso mayor es el número de la serie más cercano a n . 3. 2 13 − = i ih , en donde el paso mayor es el número de la serie que se encuentra dos posiciones antes del más cercano a n . 4.       = + k h h i i 1 (restándole 1 si ih resulta par), donde: (a) =k 2.2, (b) =k 2.4, y el paso mayor es       = k n ht *2 . Se generaron arreglos de números enteros con valores aleatorios, cuya cantidad de elementos varió entre los 10.000 y 100.000 elementos (múltiplos de 5.000). Cada iteración del test consistió en repetir 30 veces el algoritmo con arreglos distintos pero con la misma cantidad de elementos, calculando luego el tiempo promedio que tomaba el algoritmo en ordenar el arreglo. Para verificar la validez de los datos, se calculó el intervalo de confianza I en el cual se encontraría la media real de los tiempos obtenidos, con un nivel de confianza del 95%: ]262.2*,262.2*[ 11 n S X n S XI n n n n −− +−= , 30=n para cada iteración. ∑= = n i in X n X 1 * 1 (media empírica) 2 1 2 1 )(* 1 1 n n i in XX n S − − = ∑= − (varianza empírica)
  • 8. El test fue realizado en un PC con procesador Pentium 200 MMX y sistema operativo Linux (kernel 2.0.34). Los algoritmos fueron implementados en lenguaje C. Los resultados obtenidos se muestran en el siguiente gráfico: Los puntos representan el tiempo promedio obtenido por cada algoritmo. Los intervalos de confianza calculados poseen un ancho promedio del 2% del tiempo promedio obtenido, por lo que dichos tiempos se acercan bastante a la media real. Se observa en el gráfico que las series dependientes del tamaño del arreglo superan ampliamente a la mejor serie independiente del arreglo. En particular, la serie de pasos       = + 2.2 1i i h h reduce en un 24% el tiempo de la mejor serie clásica ( 1*3 1 += −ii hh ) en arreglos con 100.000 elementos. La curva que Comparación entre series de Shellsort 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0 20000 40000 60000 80000 100000 120000 Nº de elementos Tiempo[seg] Serie 1 Serie 2 Serie 3 Serie 4a Serie 4b
  • 9. mejor aproxima a los datos obtenidos utilizando esta serie es 1283644,16239043.13 * XeY − = , es decir, el tiempo promedio que toma el algoritmo en ordenar es de )( 8 9 nO aproximadamente. Se realizó el mismo test pero ahora comparando Quicksort, Mergesort y Heapsort con la mejor serie de Shellsort,       = + 2.2 1i i h h . El resultado obtenido fue el siguiente: Cabe destacar que Mergesort se demora lo mismo en ordenar un arreglo desordenado de 10.000 elementos que Shellsort, pero éste no ocupa espacio extra para realizar el ordenamiento. Quicksort sigue siendo el algoritmo más eficiente, pero hasta los 100.000 Shellsort sólo toma el doble de tiempo que Quicksort para ordenar el arreglo. Comparación de Shellsort con algoritmos de ordenamiento eficientes 0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0 50000 100000 150000 Nº de elementos Tiempo[seg] Shellsort Quicksort Mergesort Heapsort
  • 10. Resumiendo: para arreglos de menos de 100.000 elementos Shellsort se comporta mejor que Heapsort, que tiene complejidad en tiempo ))ln(*( nnO y opera "in place"; Mergesort se comporta un poco mejor que Shellsort en tiempo de ejecución, pero tiene la desventaja que no trabaja "in place"; Quicksort se comporta mucho mejor que Shellsort y también opera "in place", pero tiene la desventaja de tener un peor caso )( 2 nO . 5. Conclusiones Si bien Shellsort no es el algoritmo más eficiente para ordenar arreglos, comparado con la complejidad ))ln(*( nnO de los algoritmos Quicksort, Mergesort y Heapsort, es un algoritmo mucho más fácil de programar. Su simplicidad radica en que deriva del algoritmo más simple para ordenar, Insert Sort. Además, su complejidad promedio en tiempo de )( 8 9 nO ocupando la serie       = + 2.2 1i i h h , y su complejidad en espacio de )(nO , debido a que opera “in place”, lo hacen un buen candidato para resolver el problema de ordenamiento en conjuntos de menos de 100.000 elementos. Es vital para la eficiencia del algoritmo que todos los elementos de la serie de pasos sean números impares, para lo cual basta con restarle 1 al paso si éste es par. Con esta pequeña modificación se reduce el tiempo promedio de ejecución y su varianza. Además, el estudio demuestra empíricamente que algunas series dependientes del tamaño del arreglo reducen el tiempo de ejecución del algoritmo con respecto a las series clásicas. Sin embargo, aún no se sabe con certeza cuál es la eficiencia real del algoritmo, y es muy posible que existan series de pasos que reduzcan los tiempos de ejecución obtenidos en los tests descritos. 6. Referencias • Mark Allen Weiss, Data Structures and Algorithm Analysis, Benjamin/Cummings, 2ª ed., 1995, pág. 216-220.
  • 11. • Micha Hofri, Analysis of Algorithms: Computational Methods and Mathematical Tools, Oxford University Press, 1995, pág. 431-437. • Robert Sedgewick, Algorithms in C++, Addison-Wesley, 1992, pág. 107-112. • Sara Baase, Computer Algorithms: Introduction to Design and Analysis, Addison-Wesley, 1978, pág. 73-76.