2014 dxdy logo

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

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




 
 Двоичный (бинарный) поиск на С++
Сообщение02.01.2016, 02:01 
Реализовал алгоритм бинарного поиска для массива 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 
Вообще-то код жутковат. :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 
Ваш код работает, но можно сделать лучше.
Какой у вас инвариант для el и er?

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group