miércoles, 21 de enero de 2015

MÉTODOS DE ORDENAMIENTO DE VECTORES

Por ordenar se entiende el proceso de reorganizar un conjunto de objetos en una cierta secuencia de acuerdo a un criterio especificado. En general, el objetivo de este proceso es facilitar la posterior búsqueda de elementos en el conjunto ordenado.

MÉTODO: BURBUJA

El método de la burbuja es uno de los más simples, es tan fácil como comparar todos los elementos de una lista contra todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posición.


DIAGRAMA DE FLUJO

CÓDIGO EN JAVA
package burbuja;
import java.util.Scanner;
public class Burbuja {
public static void main(String[] args) {
System.out.println("");
Scanner entrada=new Scanner(System.in);
int a, vector[],i,n,j,aux;
vector=new int[100];
System.out.printf("ingrese la cantidad de numeros que desee en el vector: ");
n=entrada.nextInt();
n=n-1;
for(i=0;i<=n;i++)
       {
  System.out.printf("ingrese el valor del vector[%d]:",i+1);
      vector[i]=entrada.nextInt();
       }
    // ordenamiento
    for (i=0;i<=n;i++)
    {
   
    for (j=i+1;j<=n;j++)
    if (vector[i]>vector[j])
    {
     {
        aux=vector[i];
    vector[i]=vector[j];
    vector[j]=aux;
    }
    }}
   
    // impression
       System.out.printf("el vector ordenado es: ”);

    for(i=0;i<=n;i++)
    {
    System.out.println(vector[i]);   
    }
}
}


METODO: INSERCIÓN

En este procedimiento se recurre a una búsqueda binaria en lugar de una búsqueda secuencial para insertar un elemento en la parte de arriba del arreglo, que ya se encuentra ordenado. El proceso, al igual que en el método de inserción directa, se repite desde el segundo hasta el n-ésimo elemento.

DIAGRAMA DE FLUJO
CÓDIGO EN JAVA
package inserccion;
import java.util.Scanner;
public class Inserccion {
public static void main(String[] args) {
System.out.println("");
Scanner entrada=new Scanner(System.in);
int a,vector[],i,n,j,aux,k,m,po;
    vector=new int[100];
    System.out.printf("ingrese la cantidad de numeros que desee en el vector: ");
    n=entrada.nextInt();
    for(i=0;i<n;i++)
       {
       System.out.printf("ingrese el valor del vector[%d]:",i+1);
       vector[i]=entrada.nextInt();
       }
       
    // ordenamiento por insercion
    for (i=1;i<n;i++)
    {
        po=0;
   for (j=(i-1);j>=0;j--)
   {
   if(vector[i]<vector[j])
   {
   po=po+1;
   }
   }
   aux=vector[i];
   k=i;
   for (m=0;m<po;m++)
   {
   vector[k]=vector[k-1];
   k=k-1;
   }
   vector[k]=aux;
   }
   
     // impresion
    System.out.println("el vector ordenado es:");
   
   for(i=0;i<n;i++)
    {
    System.out.println(vector[i]);   
    }
    }   
}

MÉTODO: SELECCIÓN

El método se basa en buscar en cada iteracción el mínimo elemento del “subvector” situado entre el índice i y el final del vector e intercambiarlo con el de índice i. Tomando la dimensión del vector n como tamaño del problema es inmediato que el bucle se repite n veces y por tanto la función que da el número de repeticiones es de tipo lineal (O(n)).

DIAGRAMA DE FLUJO
CÓDIGO EN JAVA
package seleccion;
import java.util.Scanner;
public class Seleccion {
 public static void main(String[] args) {
System.out.println("");
Scanner entrada=new Scanner(System.in);
int i,j,a[], aux,menor,n;
a=new int[100];
System.out.printf("ingrese a cantidad de numeros que desee en el vector: ");
n=entrada.nextInt();
n=n-1;
for(i=0;i<=n;i++)
       {
  System.out.printf("ingrese el valor del vector[%d]:",i+1);
      a[i]=entrada.nextInt();
       }
for(i=1;i<n;i++)
{ menor=i;
 for(j=i+1;j<=n;j++)
 { if (a[j]<a[menor])
  {
   menor=j;
  }
 }
 aux=a[i];
 a[i]=a[menor];
 a[menor]=aux;
}
// impresion
       System.out.println("el vector ordenado es:");
   
   for(i=0;i<n+1;i++)
    {
    System.out.println(a[i]);   
    }
    }  
}

MÉTODO: SHELLSORT

Este metodo es una mejora del algoritmo de ordenamiento por Insercion (Insertsort). Si tenemos en cuenta que el ordenamiento por insercion es mucho mas eficiente si nuestra lista de numeros  esta semi-ordenada y que desplaza un valor una única posicion a la vez. Durante la ejecucion de este algoritmo, los numeros de la lista se van casi-ordenando y finalmente, el ultimo paso o funcion de este algoritmo es un simple metodo por insercion que, al estar casi-ordenados los numeros, es más eficiente.

EXPLICACIÓN

CÓDIGO EN JAVA
void shellSort(int a[], int h)
{
  int i;
  while (h > 0)
  { for (i = h-1; i<n; i++)
    {
       int B = a[i];
       int j = i;
       for (j = i; (j >= h) && (a[j - h] > B); j -= h)
       { a[j] = a[j - h];}
         a[j] = B;
     }
       h = h / 2;
  }
}



METODO: QUICKSORT

Sin duda, este algoritmo es uno de los mas eficientes. Este metodo es el mas rápido gracias a sus llamadas recursivas, basandose en la teoria de divide y vencerás. Lo que hace este algoritmo es dividir recurvisamente el vector en partes iguales, indicando un elemento de inicio, fin y un pivote (o comodin) que nos permitirá segmentar nuestra lista. Una vez dividida, lo que hace, es dejar todos los mayores que el pivote a su derecha y todos los menores a su izq. Al finalizar el algoritmo, nuestros elementos están ordenados

DIAGRAMA DE FLUJO
CÓDIGO EN JAVA

void ordenar (int vect[], int ind_izq, int ind_der)
{
  int i, j; /* variables indice del vector */
  int elem; /* contiene un elemento del vector */
  i = ind_izq;
  j = ind_der;
  elem = vect[(ind_izq+ind_der)/2];
  do
  {while (vect[i] < elem) //recorrido del vector hacia la derecha
    i++;
   while (elem < vect[j]) // recorrido del vector hacia la izquierda
    j--;
   if (i <= j) /* intercambiar */
   { int aux; /* variable auxiliar */
     aux = vect[i];
     vect[i] = vect[j];
     vect[j] = aux;
     i++;
     j--;
   }
  } while (i <= j);
  if (ind_izq < j) {ordenar (vect, ind_izq, j);} //Llamadas recursivas
  if (i < ind_der) {ordenar (vect, i, ind_der);}
}