Continuando con los métodos de búsqueda, seguimos con la busqueda secuencial por bloques que es mas eficiente que las busquedas secuenciales normales, ya
que suma la ventaja de que tiene el vector ordenado más la busqueda en un vector dividido en bloques.
El algoritmo es el siguiente:
Se divide el vector entero en bloques de (int (raíz(tamaño del vector))) elementos por bloque.
Se recorre el vector con un contador que se ira incrementando en saltos de (int (raíz(tamaño del vector))) y se va tomando el ultimo numero de cada
bloque para compararlo con el numero buscado.
Si el ultimo numero de cada bloque es igual al numero encontrado, entonces "el numero fue encontrado" de lo contrario se pregunta si el ultimo numero de
cada bloque es mayor al numero buscado, sí si, entonces se incrementa el contador en (int (raíz(tamaño del vector))) elementos. Si no entonces significa
que el numero buscado esta dentro de ese bloque, por lo que se comienza a buscar secuencialmente dentro de ese bloque.
Pero una imagen dice más que mil palabras:

Aquí está el codigo 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 N, len, cNew, cOld As Integer
-
N = txtn.Text
-
len = CType(Math.Sqrt(vec.Length), Integer) 'largo de cada bloque
-
cOld = -1
-
cNew = len - 1
-
r.Text = ""
-
-
While (r.Text = "" And cNew - 3 <vec.Length - 1)
-
If ((cNew> vec.Length - 1) And (cNew - 3 <vec.Length - 1)) Then cNew = vec.Length - 1
-
-
If (vec(cNew) = N) Then
-
r.Text = vec(cNew) & " encontrado en la posicion " & cNew
-
Else
-
If (N <vec(cNew)) Then
-
'buscamos secuencialmente en ese bloque
-
a = cOld + 1
-
While (a <cNew)
-
If (N <vec(a)) Then
-
'no se encontró
-
a = cNew
-
r.Text = "# no encontrado"
-
ElseIf (vec(a) = N) Then
-
r.Text = vec(a) & " esta en la posicion " & a
-
a = cNew
-
Else
-
a += 1
-
End If
-
End While
-
End If
-
End If
-
-
cOld = cNew
-
cNew += len
-
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!
packing machine manufacturer
April 14th, 2009 at 1:26 am
packing machine manufacturer. packing machine manufacturer in china