Búsqueda Binaria en C#

El algoritmo de búsqueda binaria es un excelente método para buscar datos dentro de una estructura(generalmente un arreglo unidimencional). Se le da el nombre de búsqueda binaria por que el algoritmo divide en dos el arregelo, aludiendo al concepto de bit, el cual puede tener dos estados.

La única condición para usar este algoritmo es que los datos dentro del arreglo estén ordenados de menor a mayor.

La solución mas fácil para realizar una busqueda es por fuerza bruta, pero este método puede resultar bastante ineficiente cuando se tiene una gran cantidad de datos, ya que habria que buscar posición por posición hasta encontrar el dato que queremos.

El código por fuerza bruta es bastante sencillo:

             for(int i=0; i<Arreglo.length; i++)
                     if(Arreglo[i] == elemento)
                     System.out.println("\nElemento encontrado en la posicion: " + i);

Solo se recorre todo el arreglo y verificamos si la posición i es igual al dato que queremos buscar, el código anterior se puede mejorar simplemente agregandole una bandera, pero aun asi no es lo suficientemente bueno.

El algoritmo de búsqueda binaria es el siguiente:

  1. Se declaran los índices superior e inferior. El inferior en 0 y el superior con el tamaño del arreglo menos 1.
  2. Se calcula el centro del arreglo con la siguiente formula:  centro = (superior + inferior) / 2
  3. Verificamos si el arreglo en la posición centro es igual al dato que buscamos. Si es igual significa que encontramos el dato y retornamos centro.
  4. Si son diferentes verificamos si el arreglo en la posición centro es mayor al dato que queremos buscar. Si es mayor actualizamos superior: superior = centro - 1, si no actualizamos inferior: inferior = centro + 1.


 5. Volvemos al paso 2.

Si cuando ya no se cumpla la condicón del ciclo y no se encontro el dato retornamos -1
indicando que el dato no se encuentra en el arreglo.

Búsqueda Binaria en C# 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BusquedaBinaria
{
    class Busqueda
    {
        private int[] vector;

        public void Cargar()
        {
            Console.WriteLine("Busqueda Binaria");
            Console.WriteLine("Ingrese 10 Elementos");
            string linea;
            vector = new int[10];
            for (int f = 0; f < vector.Length; f++)
            {
                Console.Write("Ingrese elemento " + (f + 1) + ": ");
                linea = Console.ReadLine();
                vector[f] = int.Parse(linea);
            }
        }

        public void busqueda(int num)
        {
            int l = 0, h = 9;
            int m = 0;
            bool found = false;

            while (l <= h && found == false)
            {
                m = (l + h) / 2;
                if (vector[m] == num)
                    found = true;
                if (vector[m] > num)
                    h = m - 1;
                else
                    l = m + 1;
            }
            if (found == false)
            { Console.Write("\nEl elemento {0} no esta en el arreglo", num); }
            else
            { Console.Write("\nEl elemento {0} esta en la posicion: {1}", num, m + 1); }
        }

        public void Imprimir()
        {
            for (int f = 0; f < vector.Length; f++)
            {
                Console.Write(vector[f] + "  ");
            }
        }


        static void Main(string[] args)
        {
            Busqueda pv = new Busqueda();
            pv.Cargar();
            pv.Imprimir();
            Console.Write("\n\nElemento a buscar: ");
            int num = int.Parse(Console.ReadLine());
            pv.busqueda(num);
            Console.ReadKey();
           
        }
    }
}


Al ejecutar el código muestra el siguiente resultado



10 comentarios:

  1. Me muestra un dato erróneo, inserto los valores, 1 2 3 9 8 7 4 5 6 10 (en ese orden) y al momento de buscar el elemento "9" me dice que no está en el arreglo.

    ResponderEliminar
    Respuestas
    1. Oye, primero que todo debe de estar ordenado el arreglo, por lo general se hace un metodo que ordene de menor a mayor. El 9 esta sin ordenarse dentro del algoritmo, para eso hubiese usado el algoritmo de busqueda secuencial

      Eliminar
  2. Excelente mucha sgracias me sirvio bastantee!
    (y)

    ResponderEliminar
  3. Lo he probado y no funciona, creo que para poder usar ese codigo omitiste ordenar la lista primero sino no funcionara. O encontrar otra manera ya que hay una seccion del codigo en la que comparas de manera incorrecta o asumiendo que la lista esta ordenada.

    ResponderEliminar
  4. Me gusta tu código, en mi caso decidí permitir la creación de un arreglo de n valores y no solo de 10, y solo basta reemplazar h = 9; por h = largoDelArreglo; El cual, es recibido por parámetro junto al número a buscar en el método busqueda().

    ResponderEliminar
  5. Hola, quisiera saber porque cuando el centro es mayor al dato se hace "superior = centro - 1 o inferior = centro +1 "

    ResponderEliminar
  6. Podría utilizar este método para ordenar palabras

    ResponderEliminar