martes, 2 de abril de 2019

como crear una lista doble con insert sort y shaker sort


Las listas doblemente enlazadas son estructuras de datos semejantes a las listas enlazadas simples.
La asignación de memoria es hecha al momento de la ejecución.
las listas doblemente enlazadas a diferencia de la listas simples, contienen dos punteros. uno que apunta la nodo siguiente y el otro apunta al nodo anterior


¿que es el ordenamiento por inserción?:
es una manera muy natural de ordenar para un ser humano, y puede usarse fácilmente para ordenar un mazo de cartas numeradas en forma arbitraria.
este algoritmo consiste en ir escogiendo cada número  y compararlo con el anterior de derecha a izquierda, si el número  de la derecha es mayor que el de la izquierda entonces los números cambiaran de lugar hasta que  el arreglo se encuentre completamente ordenado.

imagen tomada de wikipedia




 

código de ordenamiento insert sort arreglos:

este código se realizo en netBeans 8.2

package ejemplometododeinsercion;

import java.util.Scanner;
import javax.swing.JOptionPane;


public class EjemploMetodoDeInsercion {

  
    public static void main(String[] args) {
       
        Scanner entrada = new Scanner(System.in);
        int arreglo[];
        int nElementos, pos, aux;

        nElementos = Integer.parseInt(JOptionPane.showInputDialog("INGRESE EL NUMERO DE ELEMENTOS: "));

        arreglo = new int[nElementos];

        System.out.print("DIGITE EL ARREGLO: \n");
        for (int i = 0; i < nElementos; i++) {
            System.out.print((i + 1) + ".DIGITE UN NUMERO: ");
            arreglo[i] = entrada.nextInt();
        }
        //ORDENAMIENTO POR INSERCION
        for (int i = 0; i < nElementos; i++) {
            pos = i;
            aux = arreglo[i];

            while ((pos > 0) && (arreglo[pos - 1] > aux)) {
                arreglo[pos] = arreglo[pos - 1];
                pos--;
            }
            //ACTUALIZAR EL NUMERO 
            arreglo[pos] = aux;
        }
        System.out.print("\nORDEN ASCENDENTE: ");
        for (int i = 0; i < nElementos; i++) {
            System.out.print(arreglo[i] + " , ");
        }
        System.out.print("");

        System.out.print("\nORDEN DESENDENTE: ");
        for (int i = (nElementos - 1); i >= 0; i--) {
            System.out.print(arreglo[i] + " , ");
        }
        System.out.print("");
    }


}

código de ordenamiento por insert sort para listas dobles


 public void InserSort(){
       nodo p = this.cab.getSig();  // nodo p se ubica un posición después de la cabeza
       nodo m = p.getSig();         //nodo m se ubica una posición después de nodo p
   
       while(p != null){   //si la lista no esta vacía que entre a ordenar
       
          while(p.getAnt().getId > p.getId()  && p.getAnt() != null){   //p en posición anterior en mayor a ID y si p en su posición anterior es diferente de null p sera igual a la posición anterior
           
                p = this.exchange(p.getAnt(), p);  // se llama al método exchange para mover los nodos
             }  //el proceso se repite hasta que p ya no tenga datos los cuales intercambiar
          }
          p = m;  // p y m sseran iguales cuando se haya terminado todo el intercambio de datos
          if(p != null)
       
     
    }



¿que es el ordenamiento por shaker sort ?

El algoritmo de ordenación por el método Shaker, también conocido como "Cocktail" o "Sacudida" es una mejora del método de la burbuja en la cual el proceso se realiza tanto desde la primera posición a la última del arreglo como en sentido inverso, evitando así que los elementos más pequeños tarden un mayor tiempo en "ascender" a las posiciones superiores.

Este método permite organizar, ordenamiento e intercambio directo de elementos del arreglo. Prácticamente la idea básica de este algoritmo cociste en intercambiar, mezclar. existen dos formas en que se pueda realizar este algoritmo cada pasada tiene 2 pasadas.En la primera pasada, es de derecha a izquierda se trasladan los elementos mas pequeños hacia la izquierda del arreglo (almacenando la posición del ultimo elemento intercambiado) en la segunda pasada de izquierda a derecha se trasladan los elementos mas grandes hacia la derecha del arreglo almacenando en otra variable la posición del ultimo elemento intercambiado. Este método de ordenamiento permite visualizar la forma, en la cual se puede organizar datos desordenados que al final serán ordenados de una forma secuencial.


imagen tomada de wikipedia



código de ordenamiento shaker sort arreglos:
package ventanas;
import javax.swing.JOptionPane;
public class ShakerSort7 {

// Se declara las variables las cuales van a ser utilizadas en el metodo
    public static int derecha, izquierdo, ultimo;
    //declaracion del arreglo
    int numeros[] = new int[6];
    //se inicializa la posicion del arreglo
    int pos = 0;
    //creamos un metodo que permita guardar numeros
    public void guardarNumero() {
        //se llaman los datos de entrada que ingresa el usuario el la ventana
        String numerSt = VentanaShaker.jTextFieldNumero.getText();
        int n = Integer.parseInt(numerSt);
        //donde se guarda los numeros ingresados
        numeros[pos] = n;
        //incrementa o pasa a la siguiente posicion del arreglo para guardar
        pos++;
        // mensaje que informa que dicho numero ingresado es guardado
        JOptionPane.showMessageDialog(null, "numero  Agregado Exitosamente!!!");
        //llama al metodo siguiente
        imprimirNumeros();

    }

    //metodo para listar el arreglo en el area de texto
    public void imprimirNumeros() {
        //String se la crea para mostrar los datos o concardenarlos
        String cad = "";
        // El for de imprimir desodenados
        for (int i = 0; i < numeros.length; i++) {
            cad = cad + numeros[i] + "\t";
        }
        cad += "\n";
        //dentro del jTexArea se van a mostrar los datos desordenados o ingresados por el usuario
        VentanaShaker.jTextAreaDatos.setText(cad);
    }
    //se crea un nuevo metodo que permita recorrer el arreglo para empezar a ordenar

    public void recoorer() {
        izquierdo = 1;
        derecha = numeros.length;
        ultimo = numeros.length - 1;
        do {
            for (int i = numeros.length - 1; i > 0; i--) {
                //permite recorer el arreglo de derecha a izquierda

                if (numeros[i - 1] > numeros[i]) {
                    //La variable auxiliar es a que permite hacer el intercambio de posicion
                    int aux = numeros[i];
                    numeros[i] = numeros[i - 1];
                    numeros[i - 1] = aux;
                    ultimo = 1;

                }
            }
            izquierdo = ultimo + 1;
            for (int k = 1; k < numeros.length; k++) {
                //permite hacer el recorrico o sacudida de izquierda a derecha
                if (numeros[k - 1] > numeros[k]) {
                    int aux = numeros[k];
                    numeros[k] = numeros[k - 1];
                    numeros[k - 1] = aux;
                    ultimo = k;

                }

            }
            derecha = ultimo - 1;

            //este ciclo permite verificar si ya esta ordenado el arreglo
        } while (derecha >= izquierdo);
    }

    public void concardenar() {
        String cad = "";

        recoorer();
        //el for nuevamente recorre el arreglo para mostrar sus los datos ordenados
        for (int i = 0; i < numeros.length; i++) {
            cad = cad + numeros[i] + "\t";
        }
        cad += "\n";
        //permite mostrar en el tex area los datos ordenados
        VentanaShaker.Ordenador.setText(cad);
    }

}



diagrama de como funciona shaker sort en listas dobles 



código de ordenamiento por shaker sort para listas dobles

public void ShakerSort(){
       nodo pi = this.cab; //pi se ubica en cabeza
       nodo m = pi;  // m si iguala a p
       // evaluamos la condicion para cuando m sea diferente de null con el while
       while(m.getSig() != null){
          m = m.getSig();
       }
     
       while(pi != m && pi.getAnt() != m){
           //nodo p lo ponemos en la posición de pi
          nodo p = pi;
          //hacemos la comparación para cuando se cumpla la condición del while hasta el final
          while(p != m){
              //ponemos la condición para cuando se cumpla la condición del while
             if(p.getId() > p.getSig().getId()){
                if(p == this.cab){
                   this.cab = p.getSig();
                }
                if(p == pi){
                   pi = p.getSig();
                }
                if(p.getSig() == m){
                   m = p;
                }
                //llamanos al metodo de intercambio para mover los nodos
                p = this.exchange(p, p.getSig());
             }
             p = p.getSig();
             //se termina el recorrido
          }
          //se inicia el otro recorrido
          //ahora nos de volvemos del final hasta el inicio
          m = m.getAnt();
          //inicialisamos al  nodo q en m
          nodo q = m;
          //evaluamos la condicion con el while para que haga su recorrido q
          while(q != m){
              // condiciones para cuando qie el while pueda mover a q
             if(q.getId() < q.getAnt().getId()){
                if(q == m){
                    m = q.getAnt();
                }
                if(q.getAnt() == this.cab){
                   this.cab = q;
                }
                if(q.getAnt() == pi){
                  pi=q;
                }
                //llamamos el metodo de intercambio
                q = this.exchange(q.getAnt(), q);
             }else{
                q = q.getAnt();
             }
          }
          pi = pi.getSig();
       }
    }

}



presentado por: Cristhian Sanchez y Angel Diaz












No hay comentarios.:

Publicar un comentario