Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2010, 18:22   #1
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию Бинарный поиск

Ищу индекс элемента методом бинарного поиска:
Код:
function GetIndex(Item: ShortInt): ShortInt;
var
  Top, Bot, Mid: Byte;
  bol: boolean;

begin
  Top := High(MyArray);
  Bot := Low(MyArray);
  bol := false;
  repeat
    Mid := (Bot + Top) div 2;
    if MyArray[Mid] = Item then bol := true
    else if myArray[Mid] > Item then Top := (Bot + Top) div 2
    else Bot := (Bot + Top) div 2;
  until (bol) or (Top <= Bot);

  if bol then Result := Mid
  else Result := -1;
end;
Программа намертво виснет, если элемент либо находится в конце массива, либо отсутствует в нём. Помогите найти ошибку.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 24.05.2010, 22:53   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Попробуй так:

repeat
Mid:=(Bot + Top) div 2;
if Item < MyArray[Mid] then Top:=Mid;
if Item > MyArray[Mid] then Bot:=Mid;
if Item = MyArray[Mid] then bol:=true;
until bol or (Top <=bot);
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 24.05.2010, 23:06   #3
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Попробовал. Результат, к сожалению, тот же.
Какие ещё будут предложения?
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 24.05.2010, 23:22   #4
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Вот решение твоей проблемы:

repeat
Mid:=(Bot + Top) div 2;
if Item < MyArray[Mid] then Top:=Mid-1;
if Item > MyArray[Mid] then Bot:=Mid+1;
if Item = MyArray[Mid] then bol:=true;
until bol or (Top <=bot);
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 24.05.2010, 23:35   #5
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Теперь одини элементы находит, другие почему-то нет. Очень странно.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 25.05.2010, 00:07   #6
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

ды е..п..р..с..т. Ща разберемся!

Цитата:
Сообщение от CraZZZy-GameRRR Посмотреть сообщение
Теперь одини элементы находит, другие почему-то нет. Очень странно.
Ты поиск проводишь в упорядоченном массиве?
У меня все работает!

Блин, должно быть условие until bol or (Top < Bot);

Попробуй вот так:

Код:
function GetIndex(Item: ShortInt): ShortInt;
var
  Top, Bot, Mid: Byte;
  bol: boolean;

begin
  Top := High(MyArray);
  Bot := Low(MyArray);
  bol := false;
  repeat
    Mid:=(Bot + Top) div 2;
    if Item < MyArray[Mid] then Top:=Mid-1;
    if Item > MyArray[Mid] then Bot:=Mid+1;
    if Item = MyArray[Mid] then bol:=true;
  until bol or (Top < bot);

  if bol then Result := Mid
  else Result := -1;
end;
ICQ: 593-013-807

Последний раз редактировалось Stilet; 25.05.2010 в 08:20.
Don Karleone вне форума Ответить с цитированием
Старый 25.05.2010, 00:34   #7
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Бьюсь головой об компьютерный стол - теперь виснет, если искомый элемент меньше минимального элемента в массиве.
ИМХО Похоже, Delphi над нами издевается.

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Ты поиск проводишь в упорядоченном массиве?
Конечно!

Если нужно, выкладываю полный исходник.
Вложения
Тип файла: rar Project 1.rar (209.5 Кб, 10 просмотров)
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 25.05.2010, 01:08   #8
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Самый простой способ решить проблему - использовать массив с индексами [1..10] вместо [0..9]

Но можешь использовать и свой массив [0..9]. Я исправил ошибку. Вот проект
Вложения
Тип файла: rar Project .rar (201.4 Кб, 20 просмотров)
ICQ: 593-013-807

Последний раз редактировалось Stilet; 25.05.2010 в 08:20.
Don Karleone вне форума Ответить с цитированием
Старый 25.05.2010, 14:57   #9
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Большое спасибо, Don Karleone! Я у тебя в долгу.
CraZZZy-GameRRR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный поиск в Delphi Алексей777911 Помощь студентам 8 03.02.2011 18:00
Бинарный поиск в Memo Stranger333 Общие вопросы Delphi 0 05.05.2010 21:23
Бинарный поиск 0IceCube0 Паскаль, Turbo Pascal, PascalABC.NET 1 13.04.2010 15:52
Бинарный поиск Gendalf Помощь студентам 1 07.07.2007 22:09