ORDENAMIENTO SHELL

El método se denomina Shell en honor de su inventor Donald Shell.
Es una mejora del método de inserción directa, utilizado cuando el arreglo tiene un gran número de
elementos. Este método no compara a cada elemento con el de su izquierda, como en el de inserción,
sino con el que está a una distancia dada (llamada salto). Este salto es constante, y su valor inicial es
LIM/2 (donde LIM es el número de elementos, y la división es entera). Se van dando pasadas hasta
que en una pasada(La ultima) no se intercambie ningún elemento de sitio. Entonces el salto se reduce
a la mitad, y se vuelven a dar pasadas hasta que no se intercambie ningún elemento, y así
sucesivamente hasta que el salto vale 1.
Por ejemplo, lo pasos para ordenar el arreglo {40,21,4,9,10,35} mediante el método de Shell serían:
Salto=3:

 Primera pasada:
   {9,21,4,40,10,35} <-- se intercambian el 40 y el 9.
   {9,10,4,40,21,35} <-- se intercambian el 21 y el 10.
Salto=1:

Primera pasada:
   {9,4,10,40,21,35} <-- se intercambian el 10 y el 4.
   {9,4,10,21,40,35} <-- se intercambian el 40 y el 21.
   {9,4,10,21,35,40} <-- se intercambian el 35 y el 40.

Segunda pasada:
   {4,9,10,21,35,40} <-- se intercambian el 4 y el 9.
Con sólo 6 intercambios se ha ordenado el arreglo, cuando por inserción se necesitaban muchos más.



CODIGO FUENTE JAVA:

package vista;
import java.util.Scanner;
public class Principal {
    public static void main(String[] args) {
     
       Scanner t = new Scanner(System.in);
     
       int [] num=new int [5];
       int i=0,j=0;
       for (  i = 0; i < num.length; i++) {  
             System.out.println("Ingrese el valor "+(i+1)+ " :");
             num[i]=t.nextInt();
      }
        System.out.println("ANTES DE ORDENAR");
       for ( i = 0; i < num.length; i++) {  
             System.out.print(num[i]+" ");
      }
     
       int salto=(num.length/2);
       
         while(salto>0){
       
             int sw=0;
           
             while (sw==0) {
           
                 sw=1;
                 i=0;
                 j=i+salto;
                       
               
                 while(j<num.length){
               
                     if(num[j]<num[i]){
                   
                         int aux=num[i];
                       
                         num[i]=num[j];
                         num[j]=aux;
                         sw=0;
                     
                     }          
                        i++;
                        j++;
                        }                      
                     }    
                     salto=salto/2;
         }
       
           
        System.out.println("SHELL ORDENADO");
    for ( i=0;i<num.length;i++){
     System.out.print(num[i]+" ");  
         }
    }
 
}

Comentarios

Entradas populares