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:
  1. Public Class Form1
  2.     Dim vec(999) As Integer
  3.     Dim a As Integer
  4.  
  5.     Private Function quicksort(ByVal vec() As Integer, ByVal primero As Integer, ByVal ultimo As Integer) As Array
  6.         Dim a, b, piv, Npiv, aux As Integer
  7.         piv = vec(primero) 'sacamos pivote
  8.         Npiv = primero
  9.  
  10.         For a = primero To ultimo
  11.             If a <> Npiv Then 'si el pivote no se esta queriendo comparar con el mismo pivote
  12.                 If vec(a) <piv Then
  13.                     'mandamos los numeros a la izquierda
  14.                     aux = vec(a)
  15.  
  16.                     'recorremos sub-vector (desde piv hasta vec(a))
  17.                     For b = a To Npiv + 1 Step -1
  18.                         vec(b) = vec(b - 1)
  19.                     Next
  20.  
  21.                     vec(Npiv) = aux   'colocamos numero menor a la izquierda de piv
  22.                     Npiv += 1         'actualizamos posicion de piv
  23.                 End If
  24.             End If
  25.         Next
  26.  
  27.         'enviamos recursivamente el vector a la izuierda de piv
  28.         If (Npiv - primero <> 0) Then 'si el sub-vector de la izquierda tiene elementos, entonces se hace recursividad
  29.             vec = quicksort(vec, primero, Npiv - 1)
  30.         End If
  31.  
  32.         'enviamos recursivamente el vector a la derecha de piv
  33.         If (ultimo - Npiv <> 0) Then 'si el sub-vector de la derecha tiene elementos, entonces se hace recursividad
  34.             vec = quicksort(vec, Npiv + 1, ultimo)
  35.         End If
  36.  
  37.         Return vec
  38.     End Function
  39.  
  40.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  41.         Dim rand As New Random
  42.         Dim cad As String = ""
  43.  
  44.         For a = 0 To 999
  45.             vec(a) = rand.Next(0, 4000)
  46.         Next
  47.  
  48.         quicksort(vec, 0, vec.Length - 1)
  49.  
  50.         For a = 0 To 999
  51.             cad &= vec(a) & vbNewLine
  52.         Next
  53.         txt.Text = cad
  54.     End Sub
  55.  
  56.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  57.         Dim N, len, cNew, cOld As Integer
  58.         N = txtn.Text
  59.         len = CType(Math.Sqrt(vec.Length), Integer) 'largo de cada bloque
  60.         cOld = -1
  61.         cNew = len - 1
  62.         r.Text = ""
  63.  
  64.         While (r.Text = "" And cNew - 3 <vec.Length - 1)
  65.             If ((cNew> vec.Length - 1) And (cNew - 3 <vec.Length - 1)) Then cNew = vec.Length - 1
  66.  
  67.             If (vec(cNew) = N) Then
  68.                 r.Text = vec(cNew) & " encontrado en la posicion " & cNew
  69.             Else
  70.                 If (N <vec(cNew)) Then
  71.                     'buscamos secuencialmente en ese bloque
  72.                     a = cOld + 1
  73.                     While (a <cNew)
  74.                         If (N <vec(a)) Then
  75.                             'no se encontró
  76.                             a = cNew
  77.                             r.Text = "# no encontrado"
  78.                         ElseIf (vec(a) = N) Then
  79.                             r.Text = vec(a) & " esta en la posicion " & a
  80.                             a = cNew
  81.                         Else
  82.                             a += 1
  83.                         End If
  84.                     End While
  85.                 End If
  86.             End If
  87.  
  88.             cOld = cNew
  89.             cNew += len
  90.         End While
  91.  
  92.         If (r.Text.Length = 0) Then r.Text = "# no encontrado"
  93.     End Sub
  94. End Class

Aquí te dejo el archivo completo para que te lo descargues ;)

Descarga

Saludos!