Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Бинарный поиск. (Паскаль)

Ответить
Настройки темы
Разное - Бинарный поиск. (Паскаль)

Новый участник


Сообщения: 43
Благодарности: 1

Профиль | Отправить PM | Цитировать


Мне нужно найти эллемент в массиве, использую бинарый поиск. Я отсортировал массив, убрал все повторяющиеся эллементы.
Но почему то поис работает не правельно, особенно условие выхода из цикла какойто не правельное... иногда выводит не правельный индекс элемента, иногда не выходит из цикла если число попало ровно на середину... потаму что потом идёт увеличение на 1
можете пожалуйсто помоч.
Код: Выделить весь код
  repeat
    write('введите позитивное число, которое программа попробует найти в массиве - ');
    readln(srch);
  until(srch>0);
  Lb:=0;
  Ub:=n;
  repeat
    mid:=(Lb + Ub) div 2;
    if (srch < mass[mid]) then
    begin
      Ub := mid - 1;
    end
    else if (srch > mass[mid]) then
    begin
      Lb := mid + 1;
    end;
  until((mid=srch)or(mid=ub)or(mid=lb));
  if (mid=srch) then
  begin
    writeln('Число которое вы хотели найти',srch,'  и на ходиться на позиции ',mid);
  end;

Отправлено: 00:33, 29-05-2008

 

Новый участник


Сообщения: 43
Благодарности: 1

Профиль | Отправить PM | Цитировать


n это констанка которая равна 20.
размер массива [1..n]

Отправлено: 01:06, 29-05-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


S1stem, слово "правильно" пишется через "и". Ну и вообще, русский язык надо любить больше, чем паскаль

Цитата S1stem:
until((mid=srch)or(mid=ub)or(mid=lb));
if (mid=srch) then »
mid - это индекс в массиве, вы ищите совпадение значений, поэтому данный кусок надо переписать так:
Код: Выделить весь код
  until((mass[mid]=srch)or(mid=ub)or(mid=lb));
  if (mass[mid]=srch) then
К тому же, так как индексация массива начинается с 1, то и Lb надо сначала присваивать значение равное 1.

Остальное вроде правильно.

-------
http://ivank.ru


Отправлено: 04:59, 29-05-2008 | #3


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Может не в тему языка, но на С++ это выглядит так, если можешь перевести на Pascal или форумчане переведут... То вот...

читать дальше »
Код: Выделить весь код
//Бинарный поиск
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip>
using std::setw;

int binarySearch(const int[], int, int, int, int);
void printHeader(int);
void printRow(const int[], int, int, int, int);

int main()
{
   int const arraySize = 15; 
   int z, 
       a[arraySize],
       key,
       result;

   for(int i = 0; i < arraySize; i++)
      a[i] = 2 * i;

   cout<<"ENTER NUMBER IN DIAPAZON 0 AND 28: ";
   cin>>key;
   
   while(key != -1){
       printHeader(arraySize);
       result = binarySearch(a, key, 0, arraySize - 1, arraySize);
       if(result != -1)
          cout<<'\n'<<key<<" FOUND THE ELEMENT OF MASSIVA "<<result<<endl;
       else
          cout<<'\n'<<key<<" NO FOUND "<<endl;
      
      cout<<"ENTER NUMBER IN DIAPAZON 0 AND 28: ";
      cin>>key;
    }
   return 0;
}

// Функция бинарного поиска
int binarySearch(const int b[], int searchKey, int low, int high, int size)
{
   int midlle;
   
   while(low <= high){
       midlle = (low + high) / 2;
       printRow(b, low, midlle, high, size);
       if(searchKey == b[midlle])
           return midlle;
       else if(searchKey < b[midlle])
           high = midlle - 1;            // определение нижнего конца массива
       else
           low = midlle + 1;             // определение верхнего конца массива
     }
   return -1;
}

// Первоначальнный массив с рассположенными элементами
void printHeader(int size)
{
   int i;

   cout<<"\nINDEKS:\n";
   for(i = 0; i < size; i++)
      cout<<setw(3)<<i<<' ';
  
   cout<<'\n';
   
   for(i = 1;  i<= 4 * size; i++)
      cout<<'-';
   
   cout<<endl;
}

// Функции графического представления бинарного поиска 
void printRow(const int b[], int low, int mid, int high, int size)
{
   for(int i = 0; i < size; i++)
      if(i < low || i > high)
         cout<<"    ";
      else if(i == mid)                // отметить среднее значение
         cout<<setw(3)<<b[i]<<'*';
     else
         cout<<setw(3)<<b[i]<<' ';
        
   cout<<endl;
}

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 29-05-2008 в 17:39.


Отправлено: 12:50, 29-05-2008 | #4


Новый участник


Сообщения: 43
Благодарности: 1

Профиль | Отправить PM | Цитировать


ivank - больше спасибо ))) всё ок теперь работает.

Отправлено: 21:52, 29-05-2008 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Бинарный поиск. (Паскаль)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Теория - Паскаль и NaN ManHack Программирование и базы данных 9 20-01-2009 15:57
Разное - Паскаль, точнее его Turbo-версия ManHack Программирование и базы данных 5 09-12-2008 19:05
XML + XSL + PHP => HTML, Как передать бинарный код рисунка ? Lexxx_HU Вебмастеру 5 02-03-2007 17:55
И опять он, Паскаль!!!! Doktor Программирование и базы данных 2 23-06-2005 09:59
С++ и Паскаль Casper Программирование и базы данных 5 18-04-2003 19:35




 
Переход