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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 23:15   #1
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию Двоичный поиск

Я пыталс сделть двоичный поиск который как параметры принимает только указатель на начало массива, количество элементов и искомый элемент. Программа работает только если элемент всегда будетт находится справа, в ином случае у меня пишет сегментейшн фол. Помогите пожалуйста исправить. Спасибо!
Код:
#include <stdio.h>
#include <stdlib.h>
int l,r,m;

int indexinmas(int *left, int elem, int kol)
{
    int i;
    for(i=0;i<kol;i++)
        if (elem==left[i])
        return i;
}

int search(int *left, int k, int nel)
{


    if(l>r)
    {
        return -1;
    }
    else
    {
        m=l+(r-l)/2;
        if (k==left[m])
        {
            return m;
        }
        else
        {
            if (k<left[m])
            {
                search(left,k,m-1-l);
            }
            else
            {
                search(left+sizeof(int)*(m+1),k,r-m-1);
            }
        }
    }
}
int main()
{
    int nel;
    scanf("%d",&nel);
    int mas[nel];
    int i;
    for(i=0;i<nel;i++)
        scanf("%d",&mas[i]);
    printf("Chto nayti?");
    int find;
    scanf("%d",&find);
    l=0;
    r=nel-1;
    printf("%d",search(mas, find,nel-1));
    return 0;
}
mikebrownen вне форума Ответить с цитированием
Старый 16.10.2011, 23:16   #2
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

Можно ли как-нибудь обойтись без глобальных переменных?
mikebrownen вне форума Ответить с цитированием
Старый 17.10.2011, 15:31   #3
k1moshka
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 16
По умолчанию

Код:
int search(int *arrayPtr, int key, int low, int high) // в arrayPtr указатель на начало массива, key нужное значение, low нижняя граница "отрезка", high соответственно верхняя
{
int middle = (low + high) / 2;
if (key == arrayPtr[middle]) return middle + 1;
    else
        if (key > arrayPtr[middle]) { low = middle; search(arrayPtr, key, low, high); }
            else
            { high = middle; search(arrayPtr, key, low, high); }

}
и надо сказать, что двоичный поиск используется только в упорядоченном массиве.
А зачем тебе глобальные переменные?
k1moshka вне форума Ответить с цитированием
Старый 17.10.2011, 15:36   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от mikebrownen Посмотреть сообщение
Можно ли как-нибудь обойтись без глобальных переменных?
Переменные можно объявить локально (например, в main), а потом передавать их в функции в качестве параметров.
An1ka вне форума Ответить с цитированием
Старый 20.10.2011, 12:23   #5
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

Нельзя передавать границы массива. можно передавать только указатель на начало массива и количество элеметов и искомый элемент. Все!
mikebrownen вне форума Ответить с цитированием
Старый 20.10.2011, 12:44   #6
k1moshka
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 16
По умолчанию

оке немного переделал
Код:
int search(int *arrayPtr, int key, int count)
{
int static iter = 1;
int static low;
int static high;

if (iter == 1) { low = 0; high = count; }
iter++;
int middle = (low + high) / 2;

if (key == arrayPtr[middle]) return middle + 1;
    else
        if (key > arrayPtr[middle]) { count /= 2; low = middle; search(arrayPtr, key, count); }
            else
            { high = middle; count /= 2; search(arrayPtr, key, count); }

}

Последний раз редактировалось k1moshka; 20.10.2011 в 12:52.
k1moshka вне форума Ответить с цитированием
Старый 20.10.2011, 16:38   #7
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от k1moshka Посмотреть сообщение
оке немного переделал
Код:
int search(int *arrayPtr, int key, int count)
{
int static iter = 1;
int static low;
int static high;

if (iter == 1) { low = 0; high = count; }
iter++;
int middle = (low + high) / 2;

if (key == arrayPtr[middle]) return middle + 1;
    else
        if (key > arrayPtr[middle]) { count /= 2; low = middle; search(arrayPtr, key, count); }
            else
            { high = middle; count /= 2; search(arrayPtr, key, count); }

}
Совершенно не понятно,зачем такие причуды со статическими переменными в коде? Как связан вызов вашей функции дляодного массива с вызововм этой жефункции для другого массива?! То есть зачем передавать из одного вызова в другой статические данные?!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 20.10.2011, 21:17   #8
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

Можно ли как то сделать чтобы выводилось если ничего не нашлось минус один? когда я вставляю такую строчку во внутреннуюю проверку условия он ищет только в нижней половине массива if (middle=1) return -1;
mikebrownen вне форума Ответить с цитированием
Старый 20.10.2011, 22:44   #9
mikebrownen
Пользователь
 
Регистрация: 18.09.2011
Сообщений: 21
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичный поиск mikebrownen Помощь студентам 8 22.09.2011 23:07
Двоичный фаил Кина Помощь студентам 1 28.04.2011 21:15
Двоичный поиск в массиве структур vistaman1 Общие вопросы C/C++ 2 28.05.2010 17:30
Двоичный поиск в Turbo C++ 3.0 Xeon332 Помощь студентам 3 29.01.2009 04:19
Двоичный поиск элемента в массиве (Си под DOS) Zid@ne Общие вопросы C/C++ 7 24.12.2008 18:07