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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2010, 18:50   #1
askerpro
Новичок
Джуниор
 
Регистрация: 17.09.2009
Сообщений: 45
По умолчанию поиск определенного числа, в отсортированном массиве (с++)

Код:
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "stdio.h"
using namespace std;
void chislo(int *array, const int N, int a)
{int i=int(N/2);
while(!(array[i]==a))
{if (a[i]<a)
{
i+=int(i/2);
}
else
{
i-=int(i/2);
}
}
cout<<"index = "<<i+1<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
{int a[21]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200};
int chisl=60;
chislo(a,21,chisl);

system("pause");
    return 0;
}
есть отсротированный массив из n элементов, где n>10000.
нужно найди определенное число самым быстрым способом.
мой код указан выше.
но он не пашет.
выкидывает окно fatal error (breaK) (continue)
не могу понять, почему не пашет.

Последний раз редактировалось askerpro; 26.04.2010 в 19:14.
askerpro вне форума Ответить с цитированием
Старый 26.04.2010, 19:23   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

вроде тока отформатировал нормально, но работает без ошибок:
Код:
#include <iostream>
#include "stdlib.h"
using std::cout;
using std::endl;
void chislo(int *arr, const int N, int a){
	int i=N/2;
	while(arr[i]!=a){
		if (arr[i]<a)
			i+=i/2;
		else
			i-=i/2;
	}
	cout<<"index = "<<i+1<<endl;
}
int main(int argc, char* argv[]){
	int a[21]={0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200};
	int chisl=60;
	chislo(a,21,chisl);
	system("pause");
    return 0;
}
неплохо бы добавить проверку вхождения нужного числа в массив или как-то иначе защититься от зацикливания

Последний раз редактировалось rrrFer; 26.04.2010 в 19:27. Причина: добавил
rrrFer вне форума Ответить с цитированием
Старый 27.04.2010, 14:40   #3
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

На Хабре недавно была статья про двоичный поиск. Обязательно пройдись по списку распространённых ошибок.

Кстати, алгоритм будет быстрее, если будут три проверки:
arr[i]<a
arr[i]==a
arr[i]>a
в этом случае, если программа досрочно случайно наткнётся на искомое число, она не будет дальше сводить интервал до нуля.

Много интересного про этот алгоритм написано в книге Джона Бентли - Жемчужины программирования.
ds.Dante вне форума Ответить с цитированием
Старый 27.04.2010, 19:08   #4
askerpro
Новичок
Джуниор
 
Регистрация: 17.09.2009
Сообщений: 45
По умолчанию

и почему все таки не пашет?
от зацикливания защиту поставил бы потом, щас хотябы первую проверку прошел бы.

прочитал алгоритм из википедии, там совсем по другому)
не совсем понял с первого раза, мудрено как то слишком
askerpro вне форума Ответить с цитированием
Старый 28.04.2010, 05:19   #5
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

askerpro,

а вы не пробовали пользоваться стандартными контейнерами? они для этих целей оптимально подходят
sashonk вне форума Ответить с цитированием
Старый 28.04.2010, 09:05   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Можно попробовать применить Алгоритм Ньютона, если тема еще актуальна могу написать, лень конечно
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 29.04.2010, 23:18   #7
askerpro
Новичок
Джуниор
 
Регистрация: 17.09.2009
Сообщений: 45
По умолчанию

время для сдачи кода уже прошло, но все таки хотел бы увидеть самую простую реализацию этой задачи на си++
askerpro вне форума Ответить с цитированием
Старый 29.04.2010, 23:26   #8
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
std::binary_search( begin, end, value );
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в массиве Aleksandr Помощь студентам 3 30.01.2010 19:51
Поиск в массиве VladimirAleks Общие вопросы Delphi 3 06.11.2009 15:00
Поиск в массиве ADSoft PHP 1 07.08.2009 11:17