Merhaba,
Dizilerde arama ile ilgili ufak bir dipnot düşeceğim, çok kullandığımız bir arama şekli değil ama genel kültür olarak köşede dursun. Sıralı aramalarda tercih edilebilir. En güzel yani çok basit oluşu. Çok büyük sayılarda ufacıkta olsa performans olarak daha iyi.
Kurallar;*
Dizi elamanları sıralı olmalıdır.
Başlangıç için ;
ilk*indis*0, Bitiş indisi Length(Dizi)-1 olmalıdır.
Her seferinde ortanca değer kontrol edilir. Aranan ortancadan büyükse başlangıç ortanca + 1 olur. Küçük ise Bitiş ortanca -1 olur.
function SiraliIkiliArama(AAranan:Integer;const AArray:Array Of Integer):Boolean;
Var xFirst,xLast,xMiddle:Integer;
begin
*xFirst := 0; xLast := Length(AArray);
*while xLast >= xFirst do
*begin
* *xMiddle := (xFirst+xLast) div 2;
* *if AArray[xMiddle] = AAranan then
* * *Exit(True)
* *else if AAranan < AArray[xMiddle] then
* * *xLast *:= Pred(xMiddle)
* *else
* * *xFirst := Succ(xMiddle);
*end;
end;
function NormalAra(AAranan:Integer;const AArray:Array Of Integer):Boolean;
Var Ind : Integer;
begin
*for Ind := 0 to High(AArray) do
* *if AArray[Ind] = AAranan then
* *begin
* * *Result := True;
* * *Break;
* *end;
end;
procedure TForm1.BtnAraClick(Sender: TObject);
Var Zaman:TDateTime;
begin
*Zaman := Now;
*if SiraliIkiliArama(StrToIntDef(Edit1.Text,0),Sirali_Array) *then
* *Memo1.Lines.Add('Buldum')
*else
* *Memo1.Lines.Add('Bulamadım');
*Memo1.Lines.Add(IntToStr(MilliSecondsBetween(now,Zaman)));
*Zaman := Now;
*if NormalAra(StrToIntDef(Edit1.Text,0),Sirali_Array) *then
* *Memo1.Lines.Add('Buldum')
*else
* *Memo1.Lines.Add('Bulamadım');
*Memo1.Lines.Add(IntToStr(MilliSecondsBetween(now,Zaman)));
end;
Dizilerde arama ile ilgili ufak bir dipnot düşeceğim, çok kullandığımız bir arama şekli değil ama genel kültür olarak köşede dursun. Sıralı aramalarda tercih edilebilir. En güzel yani çok basit oluşu. Çok büyük sayılarda ufacıkta olsa performans olarak daha iyi.
Kurallar;*
Dizi elamanları sıralı olmalıdır.
Başlangıç için ;
ilk*indis*0, Bitiş indisi Length(Dizi)-1 olmalıdır.
Her seferinde ortanca değer kontrol edilir. Aranan ortancadan büyükse başlangıç ortanca + 1 olur. Küçük ise Bitiş ortanca -1 olur.
function SiraliIkiliArama(AAranan:Integer;const AArray:Array Of Integer):Boolean;
Var xFirst,xLast,xMiddle:Integer;
begin
*xFirst := 0; xLast := Length(AArray);
*while xLast >= xFirst do
*begin
* *xMiddle := (xFirst+xLast) div 2;
* *if AArray[xMiddle] = AAranan then
* * *Exit(True)
* *else if AAranan < AArray[xMiddle] then
* * *xLast *:= Pred(xMiddle)
* *else
* * *xFirst := Succ(xMiddle);
*end;
end;
function NormalAra(AAranan:Integer;const AArray:Array Of Integer):Boolean;
Var Ind : Integer;
begin
*for Ind := 0 to High(AArray) do
* *if AArray[Ind] = AAranan then
* *begin
* * *Result := True;
* * *Break;
* *end;
end;
procedure TForm1.BtnAraClick(Sender: TObject);
Var Zaman:TDateTime;
begin
*Zaman := Now;
*if SiraliIkiliArama(StrToIntDef(Edit1.Text,0),Sirali_Array) *then
* *Memo1.Lines.Add('Buldum')
*else
* *Memo1.Lines.Add('Bulamadım');
*Memo1.Lines.Add(IntToStr(MilliSecondsBetween(now,Zaman)));
*Zaman := Now;
*if NormalAra(StrToIntDef(Edit1.Text,0),Sirali_Array) *then
* *Memo1.Lines.Add('Buldum')
*else
* *Memo1.Lines.Add('Bulamadım');
*Memo1.Lines.Add(IntToStr(MilliSecondsBetween(now,Zaman)));
end;