Сортировка массива и бинарный поиск
Сформировать массив из случайных целых чисел в указанном пользователем диапазоне. Сообщить, есть ли в нем элемент, также указанный пользователем. Перед поиском элементы массива отсортировать (при этом оставив исходный массив без изменений), после чего воспользоваться бинарным поиском. В программе должны быть три процедуры - заполнение массива, сортировка, поиск элемента.
В основной ветке программы вызываются процедуры заполнения массива и сортировки. Процедура бинарного поиска вызывается уже из процедуры сортировки. Это связано с тем, что требуется оставить исходный массив неизменным, в следствие чего в процедуру сортировки передается не исходный массив, а его копия. Поэтому из основной ветке программы изменения сделанные процедурой сортировки "не видны". А вот вызов процедуры поиска из процедуры сортировки позволяет передать в первую уже измененный массив.
Алгоритм бинарного поиска осуществляется исключительно для отсортированных по возрастанию или убыванию массивов и заключается в следующем. Берется элемент в середине массива. Если искомый элемент больше взятого из середины (в случае массива отсортированного по возрастанию), то далее поиск будет продолжен в правой части от среднего; если меньше, то в левой. Эта часть далее снова делится пополам и сравнивается ее середина с искомым элементом и т. д. В конце концов если искомый элемент есть в массиве, то очередная середина отрезка массива с ним рано или поздно совпадет. Если же его нет, то границы отрезка поиска пересекутся и цикл поиска следует прервать.
Программа на языке Паскаль:
const N = 20;
type arr = array[1..N] of integer;
var
a: arr;
i: byte;
p,q,e: integer;
procedure fill(var b: arr; min,max: integer);
var k: byte;
begin
randomize;
for k:=1 to N do b[k] := random(max-min) + min;
end;
procedure search(var c: arr; elem: integer);
var m,i,j: integer;
begin
m := N div 2;
i := 1;
j := N;
while (c[m] <> elem) and (i <= j) do begin
if elem > c[m] then i := m + 1
else j := m - 1;
m := (i+j) div 2;
end;
if i > j then writeln('No')
else writeln('Yes');
end;
procedure sort(c: arr; elem: integer);
var j,k,m,id: byte;
begin
m := N;
while m > 1 do begin
id := 1;
for j := 2 to m do
if c[j] > c[id] then id := j;
k := c[id];
c[id] := c[m];
c[m] := k;
m := m - 1;
end;
search(c,elem);
end;
begin
write('Min: '); readln(p);
write('Max: '); readln(q);
write('Element: '); readln(e);
fill(a, p,q);
sort(a, e);
for i:=1 to N do write(a[i],' ');
writeln;
end.
Примеры выполнения программы:
Min: 10
Max: 25
Element: 15
No
13 17 24 16 22 22 13 17 24 23 24 24 10 18 10 12 16 20 10 20
Min: 10
Max: 25
Element: 15
Yes
18 10 19 14 21 15 15 11 21 17 21 18 17 16 24 16 14 20 10 14