En primer lugar, aquí está mi código de la ordenación Shell (con Java):¿Complejidad del tiempo para Shell sort?
public char[] shellSort(char[] chars) {
int n = chars.length;
int increment = n/2;
while(increment > 0) {
int last = increment;
while(last < n) {
int current = last - increment;
while(current >= 0) {
if(chars[current] > chars[current + increment]) {
//swap
char tmp = chars[current];
chars[current] = chars[current + increment];
chars[current + increment] = tmp;
current -= increment;
}
else { break; }
}
last++;
}
increment /= 2;
}
return chars;
}
¿Es esta una correcta ejecución de la ordenación Shell (olvidando por el momento acerca de la secuencia brecha más eficiente - por ejemplo, 1,3,7,21. ..)? Lo pregunto porque he oído que la complejidad de tiempo del mejor de los casos para Shell Sort es O (n). (Ver http://en.wikipedia.org/wiki/Sorting_algorithm). No puedo ver este nivel de eficiencia siendo realizado por mi código. Si agregué heurística a él, entonces sí, pero tal como está, no.
Dicho esto, mi principal pregunta ahora - Tengo dificultades para calcular la complejidad del tiempo Big O para mi implementación de ordenamiento de Shell. Identifiqué que el bucle externo como O (log n), el bucle medio como O (n) y el bucle más interno también como O (n), pero me doy cuenta de que los dos bucles internos en realidad no serían O (n) - serían mucho menos que esto - ¿qué deberían ser? Porque obviamente este algoritmo se ejecuta mucho más eficientemente que O ((log n) n^2).
¡Cualquier orientación es muy apreciada ya que estoy muy perdido! : P
Ver [shell-sort-java-example] (http://stackoverflow.com/questions/4833423/shell-sort-java-example) – nawfal