Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Проблема с бинарным поиском, K&R  (Прочитано 707 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Проблема с бинарным поиском, K&R
« : 20 Декабря 2017, 11:54:47 »
K&R приводит программу для бинарного поиска и предлагает улучшить ее и сравнить результат. Прежде чем пробовать писать свою версию, попробовал сначала ту, что приводится в книге (раздел 3.3). В main написал свой код для проверки: создаю массив из 100 000 элементов, заполняю его числами от 0 до 99 999. Потом пробую найти индекс произвольного числа, например, 588. Все работает, но ... скучно, т.к. искомый индекс всегда совпадает с самим числом. Если число выходит из ранга, то возвращается -1, т.е. вроде бы все как нужно.
Пробую заполнить предварительно массив другими числами, например так (строка 10): arr[i] = i + 2 Запускаю, а программа зависает. Даже если перезапускаю терминал, то все равно глючит. Помогает лишь перезагрузка. Наверное, массивы и их индексация это тонкая материя, но пока не могу понять, в чем дело.
А вот вся программа:
#include <stdio.h>
/* binsearch: find x in v[0] <= v[0] <= ... <= v[n-1]; K&R version */
int binsearch (int, int [], int);


int main() {


    int i;
    int arr[100000];
    for (i = 0; i < 100000; i++)
        arr[i] = i;
   
    printf("%d\n", binsearch(588, arr, 100000-1));
    return 0;
}


/* binsearch */
int binsearch (int x, int v[], int n) {


    int low, high, mid;


    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low + high)/2;
        if (x < v[mid])
            high = mid + 1;
        else if (x > v[mid])
            low = mid + 1;
        else    /* found match */
            return mid;
    }
    return -1;    /* no match */
}
« Последнее редактирование: 20 Декабря 2017, 20:56:48 от Jack Sparrow »
Linux is only free if your time has no value (c) Jamie Zawinski

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Re: Проблема с бинарным поиском, K&R
« Ответ #1 : 20 Декабря 2017, 14:18:38 »
Jack Sparrow, так или вы неправильно пример переписали, или он там неправильно записан
Код: (cpp) [Выделить]
    while (low <= high) {
        mid = (low + high)/2;
        if (x < v[mid])
            high = mid - 1;
        else if (x > v[mid])
            low = mid + 1;
        else    /* found match */
            return mid;
    }
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн Jack Sparrow

  • Автор темы
  • Активист
  • *
  • Сообщений: 630
    • Просмотр профиля
Re: Проблема с бинарным поиском, K&R
« Ответ #2 : 20 Декабря 2017, 19:25:29 »
Точно! Но ошибка, все же, в книге. Спасибо, все работает.
Linux is only free if your time has no value (c) Jamie Zawinski

 

Страница сгенерирована за 0.053 секунд. Запросов: 25.