Voy a Obviar que ya conoces el algoritmo del ordenamiento shell.
Te muestro un código que acabo de generar al vuelo, personalmente desconocía el ordenamiento shell pero no es tan díficl de realizar, con el Algoritmo
Esta hecho en AS3.0
Basicamente el algoritmo del ordenamiento shell dice que:
1. Tu array ordenalo en una tabla, en muestras de tamaño arbitrario (yo empece con una muestra del tamaño de la mitad de los elementos de la tabla) y de esa manera lo organizas en una tabla.
2. Vas a ordenar, por metodo de inserción, las columnas de dicha tabla.
3. Vas a reducir el tamaño de la muestra nuevamente y vuelves a organizar el nuevo array por columnas en dicha tabla y repites ese proceso hasta que todos los elementos queden ordenados.
Mi función, en AS3.0, toma como argumentos el array mismo y el tamaño del array, para definir el tamaño de la muestra.
Pero igual, puede tomar como argumento el array y dentro de la función encontrar el tamaño. Debe producir el mismo resultado.
posteriormente, declaro las variables que utilizaré para recorrer el array.
Primero defino el primer tamaño de muestra, diviendo la longitud total del array entre 2.
En mi ejemplo, la longitud de mi array es de 18 elementos.
2,5,6,8,10,2,3,64,23,76,43,27,75,33,23,45,67,89
defino un tamaño de muestra de 9 (18/2)
2, 5, 6, 8,10, 2, 3,64,3
76,43,27,75,33,23,45,67,89
Y ordeno el array por columnas:
2,5,6,8,10,2,3,64,3
76,43,27,75,33,23,45,67,89
En el segundo paso, encuentro que mi incremento es de 9/2 (pero es division entera, entonces hace clausura, y se encuentra tamaño = 5)
2 5 6 8 10
2 3 64 3 76
43 27 75 33 23
45 67 89
Y lo vuelve a hacer, hasta que queda un array completamente ordenado, tomando el tamaño de muestra original diviendolo entre 2, y así hasta que el array quede completamente ordenado, mientras el tamaño de la muestra sea mayor que 0.
finalmente te dejo el código:
Código ActionScript:
Ver originalvar arrayOriginal:Array = new Array(2,5,6,8,10,2,3,64,23,76,43,27,75,33,23,45,67,89);
trace("Array desordenado: "+arrayOriginal);
ordenamiento_shell(arrayOriginal,arrayOriginal.length);
function ordenamiento_shell(arrayDesordenado:Array, tamano:uint)
{
var i:uint;
var j:uint;
var incremento:uint;
var temp:uint;
incremento = tamano / 2;
while (incremento>0)
{
for (i=incremento; i<tamano; i++)
{
j = i;
temp = arrayDesordenado[i];
while ((j >= incremento) && (arrayDesordenado[j-incremento] > temp))
{
arrayDesordenado[j] = arrayDesordenado[j - incremento];
j = j - incremento;
}
arrayDesordenado[j] = temp;
}
incremento = incremento/2;
}
trace("Array ordenado: "+arrayDesordenado);
}
Y la salida del programa es:
Array desordenado: 2,5,6,8,10,2,3,64,23,76,43,27,75,33,23,45,67,89
Array ordenado: 2,2,3,5,6,8,10,23,23,27,33,43,45,64,67,75,76,89