UNIDAD IV
Método de la Burbuja
El método de intercambio directo, conocido coloquialmente con el nombre de la burbuja, es el mas utilizado entre los estudiantes principiantes de computación;.La idea básica de este algoritmo consiste en comparar pares de elementos adyacentes e intercambiarlos entre sí hasta que todos se encuentren ordenados.
Se realizan (n-1) pasadas, transportando en cada de las mismas el menor o mayor elemento (según sea el caso) a su posición ideal.
Ejemplo:
Se desean ordenarse las siguientes clave del arreglo
A: 15, 67, 08, 16, 44, 27, 12, 35
Primera pasada
A[7] > A[8] 12>35 No hay intercambio
A[6] > A[7] 27>12 Si hay intercambio
A[5] > A[6] 44>12 Si hay intercambio
A[4] > A[5] 16>12 Si hay intercambio
A[3] > A[4] 08>12 No hay intercambio
A[2] > A[3] 67>08 Si hay intercambio
A[1] > A[2] 15>08 Si hay intercambio
Luego de la primera pasada el arreglo queda de la siguiente forma:
A: 08, 15, 67, 12, 16, 44, 27, 35
Luego de la segunda pasada el arreglo queda de la siguiente forma:
A:= 08, 12, 15, 67, 16, 27, 44, 35
Hasta la séptima pasada el arreglo queda ordenado: 08, 12, 15, 16, 27, 35, 44, 67.
public static void burbuja(int [] A){
int i, j, aux;
for(i=0;i<A.length-1;i++)
for(j=0;j<A.length-i-1;j++)
if(A[j+1]<A[j]){
aux=A[j+1];
A[j+1]=A[j];
A[j]=aux;
}
}
MÉTODO RADIX
Es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, Radix sort no está limitado sólo a los enteros.
Existen dos clasificados del método de Radix:
LSD ---->>>dígito menos significativo
MSD --->>>dígito más significativo
Radix sort LSD procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo.
Radix sort MSD trabaja en sentido contrario.
Este ordenamiento se basa en los valores de los dígitos reales en las representaciones de posiciones de los números que se ordenan.
import java.lang.*;
import java.io.*;
public class RadixSort{
public static void radixSort(int[] arr){
if(arr.length == 0)
return;
int[][] np = new int[arr.length][2];
int[] q = new int[0x100];
int i,j,k,l,f = 0;
for(k=0;k<4;k++){
for(i=0;i<(np.length-1);i++)
np[i][1] = i+1;
np[i][1] = -1;
for(i=0;i<q.length;i++)
q[i] = -1;
for(f=i=0;i<arr.length;i++){
j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);
if(q[j] == -1)
l = q[j] = f;
else{
l = q[j];
while(np[l][1] != -1)
l = np[l][1];
np[l][1] = f;
l = np[l][1];
}
f = np[f][1];
np[l][0] = arr[i];
np[l][1] = -1;
}
for(l=q[i=j=0];i<0x100;i++)
for(l=q[i];l!=-1;l=np[l][1])
arr[j++] = np[l][0];
}
}
public static void main(String[] args){
int i;
int[] arr = new int[15];
System.out.print("original: ");
for(i=0;i<arr.length;i++){
arr[i] = (int)(Math.random() * 1024);
System.out.print(arr[i] + " ");
}
radixSort(arr);
System.out.print("\nsorted: ");
for(i=0;i<arr.length;i++)
System.out.print(arr[i] + " ");
System.out.println("\nDone ;-)");
}
}
MÉTODO QUICK SORT
El ordenamiento por partición (Quick Sort) se puede definir en una forma más conveniente como un procedimiento recursivo.
Tiene aparentemente la propiedad de trabajar mejor para elementos de entrada desordenados completamente, que para elementos semiordenados. Esta situación es precisamente la opuesta al ordenamiento de burbuja.
Este tipo de algoritmos se basa en la técnica "divide y vencerás", o sea es más rápido y fácil ordenar dos arreglos o listas de datos pequeños , que un arreglo o lista grande.
Normalmente al inicio de la ordenación se escoge un elemento aproximadamente en la mitad del arreglo, así al empezar a ordenar, se debe llegar a que el arreglo este ordenado respecto al punto de división o la mitad del arreglo.
Se podrá garantizar que los elementos a la izquierda de la mitad son los menores y los elementos a la derecha son los mayores.
Los siguientes pasos son llamados recursivos con el propósito de efectuar la ordenación por partición al arreglo izquierdo y al arreglo derecho, que se obtienen de la primera fase. El tamaño de esos arreglos en promedio se reduce a la mitad.
Así se continúa hasta que el tamaño de los arreglos a ordenar es 1, es decir, todos los elementos ya están ordenados.
public static void quicksort(int A[], int izq, int der) {
int pivote=A[izq]; // tomamos primer elemento como pivote
int i=izq; // i realiza la búsqueda de izquierda a derecha
int j=der; // j realiza la búsqueda de derecha a izquierda
int aux;
while(i<j){ // mientras no se crucen las búsquedas
while(A[i]<=pivote && i<j) i++; // busca elemento mayor que pivote
while(A[j]>pivote) j--; // busca elemento menor que pivote
if (i<j) { // si no se han cruzado
aux= A[i]; // los intercambia
A[i]=A[j];
A[j]=aux;
}
}
A[izq]=A[j]; // se coloca el pivote en su lugar de forma que tendremos
A[j]=pivote; // los menores a su izquierda y los mayores a su derecha
if(izq<j-1)
quicksort(A,izq,j-1); // ordenamos subarray izquierdo
if(j+1 <der)
quicksort(A,j+1,der); // ordenamos subarray derecho
}
MÉTODO DE BÚSQUEDA
La recuperación de información es una de las aplicaciones más importantes de las computadoras. La búsqueda de información está relacionada con las tablas para consultas. Estas tablas contienen una cantidad de información que se almacenan en forma de listas de parejas de datos. Por ejemplo un catálogo con una lista de libros de matemáticas, en donde es necesario buscar con frecuencia elementos en una lista. Existen diferentes tipos de búsqueda, pero en este informe describiremos sólo la de tipo Secuencial y Binaria.
Método de Búsqueda Secuencial:
Este método se usa para buscar un elemento de un vector, es explorar secuencialmente el vector, es decir; recorrer el vector desde el prior elemento hasta el último. Si se encuentra el elemento buscado se debe visualizar un mensaje similar a “Fin de Búsqueda” o “Elemento encontrado” y otro que diga “posición=” en caso contrario, visualizar un mensaje similar a “Elemento no existe en la Lista”.
Este tipo de búsqueda compara cada elemento del vector con el valor a encontrar hasta que este se consiga o se termine de leer el vector completo.
public class secuencialdesordenado {
public void buscar()
{
Scanner leer=new Scanner(System.in);
int i=0;
boolean bandera=false;
int x;
int v[]= new int[10];
for(int c=0;c<v.length;c++)
{
System.out.println("introduce los datos del arreglo");
v[c]=leer.nextInt();
}
System.out.println("introduzca elemento a buscar");
x=leer.nextInt();
do{
if(v[i]==x)
{
bandera=true;
}
else {
bandera=false;
}
i++;
}while(i<v.length && bandera==false);
if(bandera==true)
{
System.out.println("el elemento esta en la posicion "+ i);
}
else if(bandera==false)
{
System.out.println("el elemento no esta en la lista");
}
}
Método de Búsqueda Binaria:
Es un método que se basa en la división sucesiva del espacio ocupado por el vector en sucesivas mitades, hasta encontrar el elemento buscado.
Esta búsqueda utiliza un método de “divide y vencerás” para localizar el valor deseado. Con este método se examina primero el elemento central de la lista; si este es el elemento buscado entonces la búsqueda ha terminado. En caso contrario se determina si el elemento buscado está en la primera o segunda mitad de la lista y a continuación se repite el proceso anterior, utilizando el elemento central de esta sublista. Este tipo de búsqueda se utiliza en vectores ordenados.
package busqueda;
/**
*
* @author Ivan Leiva
*/
class BusquedaAlgoritmo {
public static int buscar( int [] arreglo, int dato) {
int inicio = 0;
int fin = arreglo.length - 1;
int pos;
while (inicio <= fin) {
pos = (inicio+fin) / 2;
if ( arreglo[pos] == dato )
return pos;
else if ( arreglo[pos] < dato ) {
inicio = pos+1;
}
else {
fin = pos-1;
}
}
return -1;
}
}
public class Busqueda {
public static void main (String args[]) {
// Llenar arreglo
int [] edades = new int [35];
for (int i = 0; i < edades.length ; i++)
edades[i] = i*i ;
// Mostrar arreglo.
for (int i = 0; i < edades.length ; i++)
System.out.println ( "edades["+i+"]: "+ edades[i]);
int resultado = BusquedaAlgoritmo.buscar(edades, 100);
if (resultado != -1) {
System.out.println ( "Encontrado en: " + resultado+ " valor 100");
} else {
System.out.println ( "El dato no se encuentra en el arreglo, o el arreglo no está ordenado." );
}
}
}
/**
*
* @author Ivan Leiva
*/
class BusquedaAlgoritmo {
public static int buscar( int [] arreglo, int dato) {
int inicio = 0;
int fin = arreglo.length - 1;
int pos;
while (inicio <= fin) {
pos = (inicio+fin) / 2;
if ( arreglo[pos] == dato )
return pos;
else if ( arreglo[pos] < dato ) {
inicio = pos+1;
}
else {
fin = pos-1;
}
}
return -1;
}
}
public class Busqueda {
public static void main (String args[]) {
// Llenar arreglo
int [] edades = new int [35];
for (int i = 0; i < edades.length ; i++)
edades[i] = i*i ;
// Mostrar arreglo.
for (int i = 0; i < edades.length ; i++)
System.out.println ( "edades["+i+"]: "+ edades[i]);
int resultado = BusquedaAlgoritmo.buscar(edades, 100);
if (resultado != -1) {
System.out.println ( "Encontrado en: " + resultado+ " valor 100");
} else {
System.out.println ( "El dato no se encuentra en el arreglo, o el arreglo no está ordenado." );
}
}
}





.jpg)

.jpg)




.jpg)
.jpg)
