Wyszukiwanie binarne pierwszego elementu

0

Wyszukiwaniem binarnym musze znaleźć PIERWSZY szukany element. Czyli np interesuje mnie 18 ale nie takie byle jakie w środku tylko pierwsze 18 w tablicy.
Jak poprawić poniższy program żeby robił to co powinien...rwe włosy z głowy bo nie moge tego poprawić..
Oczywiście nie interesuje mnie wyszukanie 18 w środku a później przechodzenie do tyłu na piechotkę.
Program powinien się kończyć i zwracać dobry wynik kiedy skrzyżują sie wskaźniki lewy(l) i prawy(p).
Wklejam cały program żeby można było przetestować czy działa

program szukbin;
const n=40;

type tab=array[1..n] of integer;

var wyn:integer;
cos:tab;

function bin(var t:tab; x:integer):integer;

var l, p, sr:integer;

begin
clrscr;
l:=0; p:=n-1;

while(l<p) do
begin
sr:=(l+p) div 2;
if t[sr]<=x then
l:=sr+1
else
p:=sr-1;
end;
if t[l]=x then
bin:=l
else
bin:=-1;

end;

begin
cos[1]:=1;cos[2]:=2;
cos[3]:=3;cos[4]:=5;
cos[5]:=6;cos[6]:=8;
cos[7]:=11;cos[8]:=13;
cos[9]:=17;cos[10]:=18;
cos[11]:=18;cos[12]:=18;
cos[13]:=18;cos[14]:=18;
cos[15]:=24;cos[16]:=25;
cos[17]:=29;cos[18]:=33;
cos[19]:=38;
wyn:=bin(cos, 18);
writeln(wyn);
end.
0

kod dla znalezienia pierwszego wystąpienia szukanej wartości z lewej strony

/*...*/
  while(l<p) do
  begin
    sr:=(l+p) div 2;
    if t[sr]>=x then
      p:=sr
    else
      l:=sr+1;
  end;
/*...*/

kod dla znalezienia pierwszego wystąpienia szukanej wartości z prawej strony

/*...*/
  while(l<p-1) do
  begin
    sr:=(l+p) div 2;
    if t[sr]<=x then
      l:=sr
    else
      p:=sr;
  end;
/*...*/

pozdrawiam, Aklimx

PS. program może czasem dawać błędny wyniki, bo n ustawiłeś na 40, co wykracza poza górną granicę (19) tej części tablicy, która wypełniona jest elementami

1 użytkowników online, w tym zalogowanych: 0, gości: 1