6Apr2008
Archivado en: Programación, Visual Basic
Autor: Angel López
Continuando con los métodos de búsqueda, seguimos con la búsqueda binaria. Este método es el que habitualmente utilizamos los humanos para encontrar un determinado elemento en una lista previamente ordenada.
El algoritmo es el siguiente:
- Se compara el valor buscado con el del elemento central del vector
- Si coinciden, se ha encontrado el numero y se finaliza la búsqueda.
- Si no coinciden, se determina si el valor buscado debe estar en la mitad izquierda o derecha del vector, dependiendo de si es inferior o superior, respectivamente, del elemento central.
La posición del elemento central del vector es calculado con la siguiente formula:
pMitad = int((pInicial + pFinal)/2)
Donde pInicial y pFinal son las posiciones inicial y final del subVector que se está considerando.
- En la mitad donde se deba continuar la búsqueda, se continua de la misma manera, es decir; se compara el valor buscado con el elemento central de esa mitad.
- Si coinciden, se ha encontrado el numero y se finaliza la búsqueda.
- Si no coinciden, se determina en cúal de las dos mitades de esta subMitad debe estar el valor buscado.
- Se continua de este modo (dividiendo el vector en subMitades) hasta que la búsqueda:
- Finalice con exito (se encuentre el elemento)
- Se finalice sin exito (no se encontro el elemento)
- Cuando pInicial sea mayor o igual a pFinal y su contenido sea diferente del valor buscado, entonces se considera que el valor buscado no existe en el vector.
Este es el algoritmo:

Aquí está el código en VB.Net
VB.NET:
-
Public Class Form1
-
Dim vec(999) As Integer
-
Dim a As Integer
-
-
Private Function quicksort(ByVal vec() As Integer, ByVal primero As Integer, ByVal ultimo As Integer) As Array
-
Dim a, b, piv, Npiv, aux As Integer
-
piv = vec(primero) 'sacamos pivote
-
Npiv = primero
-
-
For a = primero To ultimo
-
If a <> Npiv Then 'si el pivote no se esta queriendo comparar con el mismo pivote
-
If vec(a) <piv Then
-
'mandamos los numeros a la izquierda
-
aux = vec(a)
-
-
'recorremos sub-vector (desde piv hasta vec(a))
-
For b = a To Npiv + 1 Step -1
-
vec(b) = vec(b - 1)
-
Next
-
-
vec(Npiv) = aux 'colocamos numero menor a la izquierda de piv
-
Npiv += 1 'actualizamos posicion de piv
-
End If
-
End If
-
Next
-
-
'enviamos recursivamente el vector a la izuierda de piv
-
If (Npiv - primero <> 0) Then 'si el sub-vector de la izquierda tiene elementos, entonces se hace recursividad
-
vec = quicksort(vec, primero, Npiv - 1)
-
End If
-
-
'enviamos recursivamente el vector a la derecha de piv
-
If (ultimo - Npiv <> 0) Then 'si el sub-vector de la derecha tiene elementos, entonces se hace recursividad
-
vec = quicksort(vec, Npiv + 1, ultimo)
-
End If
-
-
Return vec
-
End Function
-
-
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
-
Dim rand As New Random
-
Dim cad As String = ""
-
-
For a = 0 To 999
-
vec(a) = rand.Next(0, 4000)
-
Next
-
-
quicksort(vec, 0, vec.Length - 1)
-
-
For a = 0 To 999
-
cad &= vec(a) & vbNewLine
-
Next
-
txt.Text = cad
-
End Sub
-
-
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
-
Dim I, D, P, N, band As Integer
-
N = txtn.Text
-
band = 0
-
I = 0
-
D = vec.Length - 1
-
r.Text = ""
-
-
While (I <= D And D <= vec.Length - 1 And I <= vec.Length - 1 And band = 0)
-
P = CType((I + D) / 2, Integer)
-
If (vec(P) = N) Then
-
band = 1
-
r.Text = N & " fue encontrado en la posición " & P
-
Else
-
If (N <vec(P)) Then
-
D = P - 1
-
Else
-
I = P + 1
-
End If
-
End If
-
End While
-
-
If (r.Text.Length = 0) Then r.Text = "# no encontrado"
-
End Sub
-
End Class
Aquí te dejo el archivo completo para que te lo descargues
Descarga
Saludos!
vitiligo
August 11th, 2008 at 4:35 am
The vitiligo pamphlet vitiligo is a skin,an introduction to vitiligo by the vitiligo society.