2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Двоичный (бинарный) поиск на С++
Сообщение02.01.2016, 02:01 


02/01/16

1
Реализовал алгоритм бинарного поиска для массива int длины NMAX, проверьте, плиз на корректность исходника. Хочу научиться писать правильный код, и если местная администрация не возражает, периодически буду выкладывать примеры своего кода для проверки.

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <vector>
#include <algorithm>
#include <matrix.h>

#define NMAX 10 // размер массива

using namespace std;
int s[NMAX];

int action(int x, int el, int er)
{
    while (er - el > 1)
    //пока результат не станет однозначным
    {
        // перемещаемся в центр
        int M = (el + er) / 2;

        //проверяем где находимся
        if (s[M]<x)
            el = (int)M;
        else
            er = (int)M;
    }

    //цикл нужен, чтобы не править код
    //в случае увелечения диапазона
    for (int i = el; i <= er; i++)
        if (s[i] == x) return (int)i;

    return -1;// не нашли
}

int main()
{      
    // наполняем значениями
    for(int i = 0; i < NMAX; i++) s[i] = rand();
    sort(s, s + NMAX);
    cout << action(s[5], 0, NMAX-1);
    return 0;
}
 


-- 02.01.2016, 03:25 --

Ещё такой вопрос. Как правильно говорить: размер массива или объём массива? Вроде бы чаще пишут "размер массива", но и "объём массива" вроде бы тоже на слуху. Хотя тут дело комментариев касается, но всё же.

 Профиль  
                  
 
 Re: Двоичный (бинарный) поиск на С++
Сообщение02.01.2016, 02:41 
Заслуженный участник


09/05/12
25179
Вообще-то код жутковат. :mrgreen: Поехали по порядку:
Используется синтаксис C++
#include <vector>
Зачем сие? В программе нигде ничего соответствующего не используется.
Используется синтаксис C++
#include <matrix.h>
Аналогично предыдущему, с той лишь разницей, что этого файла просто нет.
Используется синтаксис C++
#define NMAX 10 // размер массива
Это Вы на C++ пишете или на C, причем древнего стандарта? По-видимому, первое все-таки правильнее, поэтому забудьте о макросах (или хотя бы о макросах для объявления констант) и пишите правильно:
Используется синтаксис C++
const int NMAX=10;


Используется синтаксис C++
using namespace std;
Пространства имен - это вообще-то довольно полезно. Но до тех пор, пока польза не выкидывается вот этим самым образом. Конечно, так можно - но лучше бы не нужно, не стоит привыкать к плохому.
Используется синтаксис C++
int s[NMAX];
В некотором смысле аналогично предыдущему. Конечно, глобальный массив сделать можно. Но без явной необходимости - не нужно.
Используется синтаксис C++
        if (s[M]<x)
            el = (int)M;
        else
            er = (int)M;
В чем глубокий смысл приведения переменной некоторого типа к тому же самому типу? Дальше там еще один такой же случай будет...

Но в целом оно работает.

 Профиль  
                  
 
 Re: Двоичный (бинарный) поиск на С++
Сообщение02.01.2016, 16:40 
Заслуженный участник


26/05/14
981
Ваш код работает, но можно сделать лучше.
Какой у вас инвариант для el и er?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group