6Apr2008
Archivado en: Programación, Visual Basic
Autor: Angel López
Continuando con los métodos de búsqueda, seguimos con la busqueda secuencial pero ahora en un vector ordenado, lo cual tiene mas eficiencia que el mismo método pero en vector desordenado. Aquí la ventaja es de que como tu ya sabes que el vector ya esta ordenado de antemano, es más fácil y rapido detectar cuando el elemento no se encuentra dentro del vector. Pero esto no significa que este método sea el más rápido.
El algoritmo es el siguiente:
Se toma el elemento a buscar y se compara con cada una de las posiciones del vector donde esta el conjunto de datos.
Esto se hace dentro de un ciclo el cual dejará de girar cuando se encuentre un numero igual al buscado o cuando se termine el vector o cuando se detecte que un elemento dentro del vector es mayor que el buscado (en un vector ordenado ascendente).
Sí no se encontró el numero buscado, se envía un mensaje indicando que el elemento buscado no fue encontrado, de lo contrario haces lo que tu decidas con el elemento encontrado.
Aquí está el codigo en VB.Net
VB.NET:
-
Public Class Form1
-
Dim vec(999) As Integer
-
Dim a As Integer
-
-
'Esta funcion es el QuickSort y solo la usaremos para ordenar el vector
-
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 'generamos un vector de 1000 elementos con numeros aleatorios entre el 0 y el 3999
-
vec(a) = rand.Next(0, 4000)
-
Next
-
-
quicksort(vec, 0, vec.Length - 1) 'ordenamos el vector
-
-
For a = 0 To 999 'metemos el vector a una variable string para imprimirla en un cuadro de texto
-
cad &= vec(a) & vbNewLine
-
Next
-
txt.Text = cad 'imprimimos el vector en un cuadro de texto
-
End Sub
-
-
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
-
Dim n As Integer = txtn.Text '"n" es el elemento a buscar
-
r.Text = ""
-
a = 0 'nuestro contador
-
While (a <vec.Length) 'girar mientras el contador sea menor al largo del vector
-
If (n <vec(a)) Then 'si el numero buscado es menor al elemento dentro del vector en la posicion del contador, entonces significa que No se encontró el numero buscado
-
a = vec.Length 'asignamos a nuestro contador, el largo del vector para provocar salida del ciclo
-
ElseIf (vec(a) = n) Then 'si el elemento dentro del vector en la posicion del contador es igual al elemento buscado
-
r.Text = vec(a) & " esta en la posicion " & a 'imprimimos mensaje de "numero encontrado"
-
a = vec.Length 'provocamos salida del vector
-
Else
-
a += 1
-
End If
-
End While
-
-
If r.Text.Length = 0 Then r.Text = "# no encontrado" 'si ya salimos del vector Y aun no se habia enviado mensaje de "numero encontrado", significa que no se encontro el numero
-
-
End Sub
-
End Class
Aquí te dejo el archivo completo para que te lo descargues
Descarga
Saludos!
Dejar comentario