"Деление массива пополам"

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
somebody_now
Сообщения: 35
Зарегистрирован: 02 окт 2007, 14:43

Дана последовательность по возрастанию (а1..а15) и число B. Методом "деления пополам" определить номер элемента, численное значение которого совпадает с B.
Имеется следующий алгоритм:

Код: Выделить всё

const n=15;
var b,i:integer;
a:array[1..n] of integer;
begin
readln(b);
for i:=1 to n do readln(a[i]);
[B]i:=10;[/B]
while a[i]<>b do
if a[i]<b then i:=i/2 else i:=i+i/2;
writeln(i);
end.
Как-то на протяжении семестра записал его, теперь возник вопрос:
почему перед первой проверкой совпадения a и b устанавливаем i именно на 10?
да и вообще у меня большие сомнения в правильности написания алгоритма..
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Во-первых, если последовательность возрастает, то условие if a<b надо менять на противоположное. А во-вторых, с i=10 работать-то будет, но алгоритмически предпочтительней (и логичнее) взять i=7 или 8.
Оператор i:=i+i/2; тоже неверен, здесь надо i+(n-i)/2, округлять вверх
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

И условие последнего цикла нужно менять ( а вдруг, В не равен ни одному элементу массива?) .
somebody_now
Сообщения: 35
Зарегистрирован: 02 окт 2007, 14:43

Хыиуду, спасибо, разобрался)
Albor, в условии подразумевалось, что такой элемент в массиве обязательно присутствует.
Ответить