Está en la página 1de 18

Métodos

Ordenación
&
Búsqueda
Algoritmos y Estructura de
Datos I

Ing. Roger M. Sánchez Chávez


Agenda
▪ Introducción
▪ Ordenar por Inserción
▪ Ordenar por Selección
▪ Ordenar por QuickSort
▪ Búsqueda Binaria
▪ Búsqueda Binaria Recursiva
▪ Actividad propuesta
Introdución
Ordenar por Inserción
Ordenar por Selección
Ordenar por QuickSort
Comparación
Actividad propuesta
Elaborar una prueba de escritorio para ordenar los siguientes arreglos:

• Usando el método de Inserción


[15, 5, 4, 18, 12, 19, 14, 10, 8, 20]

• Usando el método de Selección


[11, 7, 12, 14, 19, 1, 6, 18, 8, 20]

• Usando el método de QuickSort


[14, 17, 13, 15, 19, 10, 3, 16, 9, 12]

https://www.toptal.com/developers/sorting-algorithms
Búsqueda Binaria
• Búsqueda del menor
menor = a[0];
for (i=1;i<n;i++)
if ( a[i]<menor )
menor=a[i];
• Búsqueda del mayor
mayor= a[n-1];
for (i=0;i<n-1;i++)
if ( a[i]>mayor )
mayor=a[i];
• Búsqueda de elemento
encontrado=-1;
for (i=0;i<n;i++)
if ( a[i]==elemento_buscado )
encontrado=i;
Búsqueda Binaria
El caso anterior de búsqueda asume que los
elementos están en cualquier orden.
Una búsqueda más eficiente puede hacerse
sobre un arreglo ordenado. Una de éstas es la
Búsqueda Binaria.
La Búsqueda Binaria, compara si el valor
buscado está en la mitad superior o inferior.
En la que esté, subdivido nuevamente, y así
sucesivamente hasta encontrar el valor.
Búsqueda Binaria Recursiva
1. Para buscar en el arreglo, elegir un índice entre desde y hasta (llamémoslo mid) y comparar
el valor en esa posición con el dato que estás buscando.
2. Si la encontraste, parar.
3. Si el valor en medio es mayor que tu dato, buscar en el rango entre desde y mid-1.
4. Si el valor en medio es menor que tu dato, buscar en el rango entre mid+1 y hasta.

Los pasos 3 y 4 se ven sospechosamente como llamados recursivos.


Actividad propuesta
Investigar en grupos de cuatro estudiantes, uno de los siguientes métodos:

1. Ordena Shell. Grupo 4: Arribasplata Pisco


2. Ordena Heapsort (por montículos). Grupo 5: Bautista Huingo
3. Ordena Mergesort. Grupo 3: Castillo Palacios
4. Ordena Radixsort. Grupo 2: Aguirre Toribio
5. Ordena Binsort. Grupo 1: Mejía Zambrano
6. Busca Hashing Grupo 6: Albites Membrillo

Elaborar un informe con la siguiente información:


- Introducción
- Teoría
- Algoritmo
- Implementación
- Ejercicio practico
- Conclusiones
Gracias
ALGORITMOS DE ORDENACIÓN Y BUSQUEDA EN ARREGLOS

INSERCIÓN
SELECCIÓN
QUICKSORT
public class BuscaBinaria {
public static void main(String[] args) {
System.out.println("Arreglo Original");

int nro[]= {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97};

verArreglo(nro);
System.out.println("\nUbicación del dato y Numero de iteracciones");
System.out.println("\nBusqueda Binaria");
busBinaria(nro, 67);
System.out.println("\nBusqueda Secuencial");
busSecuencial(nro, 67);

public static void busBinaria(int a[], int dato) {


int inf=0, sup, cen=0, conta=0;
boolean noEsta=true;

sup=a.length-1;
while(inf<=sup && noEsta) {
cen=(inf+sup)/2;
if(a[cen]==dato)
noEsta=false;
else {
if(a[cen]<dato)
inf=cen+1;
else
sup=cen-1;
}
conta++;
}
if(noEsta)
System.out.println("Dato no encontrado...");
else
System.out.println("Posición: "+cen+" - Iteracciones: "+conta);
}

public static void verArreglo(int a[]) {


for(int i=0; i<a.length; i++)
System.out.print(a[i]+" ");
System.out.println("");
}

public static void busSecuencial(int b[], int valor) {


int pos=0, conta=0;
for(int i=0; i<b.length;i++) {
if(b[i]==valor) {
pos= i;
break;
}
conta++;
}
System.out.println("Posición: "+pos+" - Iteracciones: "+conta);
}
}
public class BuscaRecursiva {
public static void main(String[] args) {
System.out.println("Arreglo Original");

int nro[]= {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97};

verArreglo(nro);
System.out.println("\nUbicación del dato y Numero de iteracciones");

System.out.println("\nPosición: "+busBinariaRecursiva(nro, 67, 0, nro.length-1));

public static int busBinariaRecursiva(int a[], int dato, int izq, int der){
// Si izquierda es mayor que derecha significa que no encontramos nada
if(izq > der){
return -1;
}
// Calculamos las mitades...
int iMedio = (int) Math.floor((izq + der) / 2);
int eMedio = a[iMedio];
// Ver si está en la mitad
if(eMedio == dato){
return iMedio;
}
// Si no, entonces vemos si está a la izquierda o derecha
if(dato < eMedio){
der = iMedio - 1;
return busBinariaRecursiva(a, dato, izq, der);
}else{
izq = iMedio + 1;
return busBinariaRecursiva(a, dato, izq, der);
}
}

public static void verArreglo(int a[]) {


for(int i=0; i<a.length; i++)
System.out.print(a[i]+" ");
System.out.println("");
}

También podría gustarte