A busca binária é um eficiente algoritmo para encontrar um item em uma lista ordenada de itens. Ela funciona dividindo repetidamente pela metade a porção da lista que deve conter o item, até reduzir as localizações possíveis a apenas uma.
Segue exemplo:
Código: Selecionar todos
#include "inkey.ch"
PROCEDURE Teste()
LOCAL a := { "\u0026", ; // 1
"\u0027", ; // 2
"\u00c0", ; // 3
"\u00c1", ; // 4
"\u00c2", ; // 5
"\u00c3", ; // 6
"\u00c4", ; // 7
"\u00c7", ; // 8
"\u00c8", ; // 9
"\u00c9", ; // 10
"\u00ca", ; // 11
"\u00cb", ; // 12
"\u00cc", ; // 13
"\u00cd", ; // 14
"\u00ce", ; // 15
"\u00cf", ; // 16
"\u00d1", ; // 17
"\u00d2", ; // 18
"\u00d3", ; // 19
"\u00d4", ; // 20
"\u00d5", ; // 21
"\u00d6", ; // 22
"\u00d9", ; // 23
"\u00da", ; // 24
"\u00db", ; // 25
"\u00e0", ; // 26
"\u00e1", ; // 27
"\u00e2", ; // 28
"\u00e3", ; // 29
"\u00e4", ; // 30
"\u00e7", ; // 31
"\u00e8", ; // 32
"\u00e9", ; // 33
"\u00ea", ; // 34
"\u00ea", ; // 35
"\u00ec", ; // 36
"\u00ed", ; // 37
"\u00ee", ; // 38
"\u00ef", ; // 39
"\u00f1", ; // 40
"\u00f2", ; // 41
"\u00f3", ; // 42
"\u00f4", ; // 43
"\u00f5", ; // 44
"\u00f6", ; // 45
"\u00f9", ; // 46
"\u00fa", ; // 47
"\u00fb", ; // 48
"\u00fc" ; // 49
}, nSelect
SetColor( "N/BG,W+/B,,,W/BG" )
While LastKey() != K_ESC
nSelect := Achoice( 2, 2, MaxRow()-5, 30, a )
If nSelect > 0
nSelect := ASeek( a[ nSelect ], a )
Else
Exit
Endif
Alert( If( nSelect > 0, "Posicao " + LTrim( Str( nSelect ) ) + ": " + a[ nSelect ], "Nao Encontrado" ) )
Enddo
RETURN
//----------------------------------------------------
FUNCTION ASeek( xArg, aArray )
LOCAL nLower, nMid, nUpper, nRet := -1
// aArray tem que estar obrigatoriamente ordenado de forma ascendente
If hb_IsArray( aArray ) .And. ! Empty( aArray ) .And. ! hb_IsNil( xArg )
nLower := 1
nUpper := Len( aArray )
while ( nLower <= nUpper )
nMid := Int( ( nLower + nUpper ) / 2 )
If ( xArg == aArray[ nMid ] )
nRet := nMid
Exit
Elseif ( xArg < aArray[ nMid ] )
nUpper := nMid - 1
Else
nLower := nMid + 1
Endif
Enddo
Endif
RETURN nRet
//----------------------------------------------------

