gentoo linux, java, software libre y otras hierbas
nov, 18 2008 - 8:43 pm

Busqueda Binaria – C Sharp

Hace unos dí­as y poní­a un ejemplo acerca de búsquedas lineales en arreglos, ésta vez hablaremos acerca de las búsquedas lineales, un método mucho más rápido para buscar elementos.

¿Cómo funciona este método? Para poder aplicar éste método de búsqueda es necesario que el arreglo esté ordenado; posteriormente, se aplica el siguiente algoritmo: se ubica el elemento de la mitad del arreglo, entonces, si el número que se está buscando dentro del arreglo es menor al número de la mitad, se busca el número de la mitad entre el inicio del y la mitad del mismo, y así­ hasta encontrar el elemento deseado.

Por ejemplo, suponiendo que tenemos un arreglo con los siguientes valores:

2, 4, 5 , 6, 8, 9, 10, 12, 24, 34, 46, 56, 60, 67, 78, 89, 90

…y queremos buscar el valor 10; tenemos que, el elemento de la mitad contiene el valor 24. Puesto que 24 > 10, buscamos el valor intermedio entre el principio del arreglo y la mitad del mismo, esto es 8. Puesto que 8 < 10, buscamos el valor intermedio entre 8 y la mitad del arreglo (24), esto es 10. Así­, con tan solo 3 bucles, hemos conseguido el valor buscado.

Vamos con el código del programa, que nos sacará de toda duda:

using System;
using System.Drawing;
using System.Windows.Forms;
public class EjemploBusquedaBinaria : Form
{
  private Label labelSolicitar;
  private TextBox cajaEntrada;
  private Label labelResultado;
  private Label labelMostrar;
  private Label labelSalida;
  private Button botonBuscar;
  int[] a = { 0, 2, 4, 6, 8, 10, 12, 14, 16,
              18, 20, 22, 24, 26, 28 };
  public EjemploBusquedaBinaria(){
     InitializeComponent();
  }
  private void InitializeComponent() {
     this.labelMostrar = new Label();
     this.labelResultado = new Label();
     this.cajaEntrada = new TextBox();
     this.labelSolicitar = new Label();
     this.botonBuscar = new Button();
     this.labelSalida = new Label();
     this.SuspendLayout();
     //
     // labelMostrar
     //
     this.labelMostrar.Location = new System.Drawing.Point(261, 8);
     this.labelMostrar.Name = "labelMostrar";
     this.labelMostrar.Size = new System.Drawing.Size(152, 20);
     this.labelMostrar.TabIndex = 3;
     //
     // labelResultado
     //
     this.labelResultado.Location = new System.Drawing.Point(213, 8);
     this.labelResultado.Name = "labelResultado";
     this.labelResultado.Size = new System.Drawing.Size(50, 16);
     this.labelResultado.TabIndex = 2;
     this.labelResultado.Text = "Resultado:";
     //
     // cajaEntrada
     //
     this.cajaEntrada.Location = new System.Drawing.Point(99, 8);
     this.cajaEntrada.Name = "cajaEntrada";
     this.cajaEntrada.TabIndex = 1;
     this.cajaEntrada.Text = "";
     //
     // labelSolicitar
     //
     this.labelSolicitar.Location = new System.Drawing.Point(27, 8);
     this.labelSolicitar.Name = "labelSolicitar";
     this.labelSolicitar.Size = new System.Drawing.Size(56, 16);
     this.labelSolicitar.TabIndex = 0;
     this.labelSolicitar.Text = "Digite el dato";
     //
     // botonBuscar
     //
     this.botonBuscar.Location = new System.Drawing.Point(152, 40);
     this.botonBuscar.Name = "botonBuscar";
     this.botonBuscar.Size = new System.Drawing.Size(136, 24);
     this.botonBuscar.TabIndex = 5;
     this.botonBuscar.Text = "Buscar dato";
     this.botonBuscar.Click += new System.EventHandler(this.botonBuscar_Click);
     //
     // labelSalida
     //
     this.labelSalida.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
     this.labelSalida.Location = new System.Drawing.Point(10, 80);
     this.labelSalida.Name = "labelSalida";
     this.labelSalida.Size = new System.Drawing.Size(420, 72);
     this.labelSalida.TabIndex = 4;
     //
     // EjemploBusquedaBinaria
     //
     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
     this.ClientSize = new System.Drawing.Size(440, 157);
     this.Controls.AddRange(new Control[] {
            this.botonBuscar,
            this.labelSalida,
            this.labelMostrar,
            this.labelResultado,
            this.cajaEntrada,
            this.labelSolicitar});
     this.Name = "EjemploBusquedaBinaria";
     this.Text = "Busqueda Binaria";
     this.ResumeLayout(false);
  }
  static void Main() {
     Application.Run( new EjemploBusquedaBinaria() );
  }
  private void botonBuscar_Click( object sender,
     System.EventArgs e )
  {
     int valorBuscar = Int32.Parse( cajaEntrada.Text );
     // iniciar los datos de salida
     labelSalida.Text = "Portions of array searched\n";
     // realizar busqueda binaria
     int elemento = Buscar( a, valorBuscar );
     if ( elemento != -1 )
        labelMostrar.Text = "Valor encontrado en indice " +
           elemento;
     else
        labelMostrar.Text = "Valor no encontrado";
  } // fin botonBuscar_Click
  // buscar mediante metodo binario
  public int Buscar( int[] array, int dato ) {
     int bajo = 0;
     int alto = array.Length - 1;
     int medio;
     while ( bajo <= alto ) {
        medio = ( bajo + alto ) / 2;
        // el siguiente método nos muestra la porción del
        // arreglo donde se está llevando a cabo la busqueda
        // del dato en cada iteración del bucle
        construirSalida( a, bajo, medio, alto );
        if ( dato == array[ medio ] )   // si se encuentra el valor
           return medio;
        else if ( dato < array[ medio ] )
           alto = medio - 1;   // buscar en la mitad más baja
        else
           bajo = medio + 1;   // buscar en la mitad más alta
     } // fin de la busqueda binaria
     return -1;  // dato no encontrado
  } // fin del metodo Buscar
  public void construirSalida(
     int[] array, int bajo, int mid, int alto ) {
     for ( int i = 0; i < array.Length; i++ ) {
        if ( i < bajo || i > alto )
           labelSalida.Text += "    ";
        // marcar el elemento de la mitad en la salida
        else if ( i == mid )
           labelSalida.Text +=
              array[ i ].ToString( "00" ) + "* ";
        else
           labelSalida.Text +=
              array[ i ].ToString( "00" ) + "  ";
     }
     labelSalida.Text += "\n";
  } // fin de construirSalida
} // fin de la clase EjemploBusquedaBinaria

Descargar código fuente

Los ejercicios utilizados en este post están basados en ejemplos del libro C# How to Program de Deitel. Se pone a disposición la descargar del programa original, desarrollado para trabajar sobre Visual Studio de Microsoft en plataformas Windows, y se encuentra en inglés. La versión simplificada está basada en la original, pero sin código basura insertado por Visual Studio, se encuentra en español y ha sido probada sobre Gnu/Linux usando Mono.

17 Comentarios | deja el tuyo

Un enlace entrante

16 Comentarios en “Busqueda Binaria – C Sharp”

  1. Andy Villalobo dice:

    Hola quisiera me enviaran por email todo lo que tengan acerca de busqueda binaria, es para un trabajo de la escuela, ok gracias

  2. joauqin guzman dice:

    hola..queria pedirles que me manden ejemplos de todo tipo en c sharp.gracias.
    joaquinguzman282@hotmail.com

  3. ramon ortyz dice:

    Hola quisiera me enviaran por email todo lo que tengan acerca de busqueda mas simple, es para un trabajo de la escuela, ok gracias

  4. LUIS AUGUSTO dice:

    Hola como estan .. por ahi estube leyendo y viendo lo que ustedes tienen de busqueda binaria y veo que esta muy entendible y me gustaria que me enviaran mas sobre este metodo binario; ejemplos , algoritmos etc es para un trabajo. GRACIAS…

  5. la verdad esta pagina esta muy mal hecha por que casi no se le entiende am he calado estos programas asi como estan y no corren contiene muchos errores que no es posible que no se dne cuentha ashhh

    • Cristian dice:

      Eres el único que no ha podido con los ejercicios desde hace 4 años que existe el blog… tal vez el problema no es la página, tal vez seas tú.

      Un saludo!

      • DEJAME DECIRTE QUE SOY TECNICO EN INFORMATICA Y ESOS PROGRAMAS NO SON TAN PERFECTOS COMO LOS HACEN VER EN ESTA PAGINA ADEMAS LOS ACAVO DE CHECAR Y TIENE MUCHOS ERRORES TE RECOMENDARIA QUE LOS PASARAS A ABORLAND C++ PARA QUE TE DIERAS CUENTA EN LO QUE ESTAS EQUIVOCADO

        • Cristian dice:

          Primero: no escribas todo en mayúsculas. Es bastante molesto :D

          Segundo: tu puedes ser técnico en informática, cocinero, sacerdote o lo que sea, eso no tiene nada que ver. Y sí, los programas no son “tan perfectos”, pero funcionan. Como “técnico” en informática eso no debería ser problema, vos mismo podrías arreglar eso (te recomiendo este artículo: http://casidiablo.net/ingenieros/ ).

          El mismo programa está hecho aquí mismo en Java si mal no recuerdo, y funciona. Si no te sirve o no supiste cómo correrlo ni modos, hay muchas otras páginas donde se explica… a los que le sirve, excelente, a los que no, ni modos ;)

          Un saludo!

          • No lo hago con la intecnion de molestar ni mucho menos solo son comentarios que te recomiendo que tomes en cuenta ya que como colegas devemos ayudarnos entre si si te ofendi disculpame y te recomiendo que te enfoques mas en el programa solo te pido de favor que lo agas un poco mas explicito por que a mis alumnos les recomende esta pagina por que se que es muy buena y me disculpo de nuevo gracias

          • Cristian dice:

            No te preocupes, no me has ofendido.

            El programa, lo miré hace un rato… descargué el código tal como está, desenfundé el compilador de C# de Mono, lo compilé y ejecuté. Por un momento pensé que era de esos programas que uno hace mal de gusto (usted sabe, para no darle todo “masticado” a los estudiantes, sino que se les obligue a revisar el código para qué no funciona… pero en este caso no es así).

            A mi parecer está bien… tal vez le hace falta algo de explicación (no todo se puede hacer como en este artículo por ejemplo http://casidiablo.net/tutorial-basico-android/ ), pero creo que la idea no es muy difícil.

            Un saludo y gracias por las sugerencias!

          • Saves en un par de dias suvire mi pagina personal y miraras el mismo codigo que tu tienes pero de manera a como yo te lo estoy diciendo manana te dejare mi direccion y me das tu opinion que dices aceptas o no

          • Cristian dice:

            Por supuesto, eso sería genial. La idea es que le sirva a muchas personas…

            Un saludo!

          • oliver dice:

            gracias pero me gusta hacerlo por mis propios esfuerzos y tengo un gran deber que tengo que entregar en unos dias estoy casi muerto

  6. oliver dice:

    gracias por el gran ejemplo pero bastaia con un poquito solo necesitaba la sintaxis de la busqueda binaria no todo un programa…gracias

  7. rosa dice:

    no hay nada de interessante por favor si van a poner algo que sirva ok

    no me gusto para nada easo

¡Déjanos tu comentario!