Всем доброго времени суток, проблема вот в чем - я нашел код на бин поиск, но там нету сортировки массива по возростанию, как я понял без нее нормально работать прога не будет, и нету возможности выбрать количество элементов массива в ручную, чтоб пользователь ввел в едит количество элементов...вот код делфи просто бин поиска, помогите его откорректировать так как надо...С уважением, Андрей(((((((
Наверное стоит проверить что числа возрастают (или убывают), а затем вывести сообщение что "бинарный поиск не может работать в не отсортированном массиве".
Дальше идет бинарный поиск. вот функцию надыбал... Уважаемые форумчане, помогите склепать прогу(
Код:
function WithOutSort (const a : TArr; const n : Integer) : Boolean;
var
Up, Down : Boolean;
i : Integer;
begin
i := 2;
while (i <= n) and (a[i] > a[i-1]) do
Inc (i);
Up := i > n;
i := n;
while (i >= 2) and (a[i] < a[i-1]) do
Dec (i);
Down := i = 1;
WithOutSort := Up or Down;
end;
бин поиск
Код:
unit b_found_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Label3: TLabel;
CheckBox1: TCheckBox;
StringGrid1: TStringGrid;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ Бинарный поиск в массиве }
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=10;
var
a:array[1..SIZE] of integer; { массив }
obr:integer; { образец для поиска}
verh:integer; { верхняя граница поиска }
niz: integer; { нижняя граница поиска }
sred:integer; { номер среднего элемента }
found:boolean;{ TRUE - совпадение образца с элементом массива }
n:integer; { число сравнений с образцом }
i:integer;
begin
// ввод массива и образца
for i:=1 to SIZE do
a[i]:=StrToInt(StringGrid1.Cells[i-1,0]);
obr := StrToInt(Edit1.text);
// поиск
verh:=1;
niz:=SIZE;
n:=0;
found:=FALSE;
label3.caption:='';
if CheckBox1.State = cbChecked
then Label3.caption:='verh'+#9+'niz'#9'sred'#13;
// бинарный поиск в массиве
repeat
sred:=Trunc((niz-verh)/2)+verh;
if CheckBox1.Checked
then Label3.caption:=label3.caption
+IntToStr(verh) + #9
+IntToStr(niz) + #9
+IntToStr(sred) + #13;
n:=n+1;
if a[sred] = obr
then found:=TRUE
else
if obr < a[sred]
then niz:=sred-1
else verh:=sred+1;
until (verh > niz) or found;
if found
then label3.caption:=label3.caption
+'Совпадение с элементом номер '
+ IntToStr(sred)+#13
+ 'Cравнений ' + IntToStr(n)
else label3.caption:=label3.caption
+'Образец в массиве не найден.';
end;
// нажатие клавиши в ячейке StringGrid
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then // нажата клавиша <Enter>
if StringGrid1.Col < StringGrid1.ColCount - 1
then // курсор в следующую ячейку таблицы
StringGrid1.Col := StringGrid1.Col +1
else // курсор в поле Edit1, в поле ввода образца
Edit1.SetFocus; // п
end;
// нажатие клавиши в поле Edit1
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 // нажата <Enter>
then // сделать активной командную кнопку
Button1.SetFocus;
end;
end.