miércoles, 3 de diciembre de 2008

METODO DE CLASIFICACION SHELL

CREADO POR:
ROLANDO HERRERA
ITZEL MEDINA


MÉTODO DE CLASIFICACIÓN SHELL

DEFINICION:
Ordena una lista de n elementos aplicando el método de inserción, pero no a valores contiguos de la lista, sino a valores separados por un cierto incremento o distancia. Es decir, primero clasifica los elementos muy separados, después elementos más cercanos, y así sucesivamente hasta que finalmente se comparan elementos contiguos. Debido a esta característica, el método también se denomina clasificación por disminución del incremento.


OBJETIVO:
El objetivo de este método es que ordena subgrupos de elementos separados n del arreglo original. El valor dado a n es el llamado incremento.Después de que los primeros n subgrupos han sido ordenados (para este caso se utiliza la inserción directa, ya que es la forma mas común de hacerlo), se escoge un nuevo valor de n más pequeño, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de n.


METODO DE CLASIFICACION SHELL:
La ordenación de Shell usa una secuencia, h1, h2, . . ., ht, conocida como la secuencia de incrementos. Al principio de todo proceso, se fija una secuencia decreciente de incrementos. Cualquier secuencia funcionará en tanto que empiece con un incremento grande, pero menor al tamaño del arreglo de los datos a ordenar, y que el último valor de dicha secuencia sea 1.


EJEMPLO EN CODIFICACION C++:
void shell(int n)
{
int i,j,m,k,x;
for(m=t;m>0;m--)
{
k=pow(2,m)-1;
for(i=k;i {
x=arr;
j=i-k;
while(x=0)
{
arr[j+k]=arr[j];
j-=k;
}
arr[j+k]=x;
}
}
}



EJEMPLO EN CODIFICACION JAVA:

package listaContigua;
import Comparable;
import listaException.*;
public class Shell {
private static Object posiciona(int i) {
Posicion p = new Posicion();
p.posicion = i-1;
return p;
}

private static void insercion(Lista lista, int n, int ini, int inc) {
try {
for(int i=ini+inc; i<=n; i+=inc) {
for(int j=i; j>ini; j-=inc) {
Comparable e1 = (Comparable)lista.recupera(posiciona(j));
Comparable e2 = (Comparable)lista.recupera(posiciona(j-inc));
if (e1.mayorIgualQue(e2)) break;
lista.modifica(posiciona(j),e2);
lista.modifica(posiciona(j-inc),e1);
}
}
} catch (ListaException e) {
System.err.println("Error en el uso de la lista");
}
}

public static void ordena(Lista lista) {
int inc = lista.longitud();
do {
inc = (inc/3)+1;
for(int ini=1; ini<=inc; ini++)
insercion(lista,lista.longitud(),ini,inc);
} while (inc>1);
}
} // fin class Shell



PARA QUE FUE CREADO ESTE METODO:
Esta clasificación se desarrolló para evitar la ineficiencia de la clasificación por burbujas para grandes matrices.
La clasificación de Shell se diferencia de la clasificación por Burbuja en que se compara elementos mas separados antes de comparar los elementos adyacentes. Esto elimina gran parte del desorden de la matriz en las primeras iteraciones.
La clasificación de Shell utiliza una variable llamada intervalo que inicialmente recibe un valor igual a la mitad del número de elementos que hay en la matriz. El valor del intervalo especifica la distancia entre cada par de elementos comparables de la matriz.
.44 .11 .11 .11 .11 .
.88 .88 .66 .66 .66 .
.22 .22 .22 .22 .22 .
.77 .77 .77 .77 .55 .
.33 .44 .44 .44 .44 .
.66 .66 .88 .88 .88 .
.44 .44 .44 .44 .44 .
.55 .55 .55 .55 .77.
Los elementos separados serán inicialmente de un intervalo de 4 para este ejemplo, la primera iteración de la matriz comparara todos los elementos separados por esa distancia el proceso se repite hasta que no hay intercambios, con un intervalo de 4 y se vuelve a iniciar calculando el nuevo intervalo hasta que este llegue a 1.


IMPLEMENTACION DE ESTE METODO:
En el método de ordenación Shell propone que las comparaciones entre elementos se efectúen con saltos de mayor tamaño pero con incrementos se efectúen con saltos de mayor tamaño pero con incrementos decrecientes, así los elementos quedarán ordenados en el arreglo.