Задача рекурсивного алгоритма для выполнения двоичного поиска в отсортированном массиве
Я хочу внедрить алгоритм двоичного поиска массива ордеров.
int Array::Search(int target, int* start, int* tail){ if(start>tail){ cout<<"not find"<<endl; return -1; } int offsetMid= (tail-start)/2/sizeof(int);//by unit of int cout<<"offset: "<<offsetMid<<" mid " <<*(start+offsetMid)<<endl; cout<<start<<" " <<tail<<endl; if(target == *(start+offsetMid) ){ cout<<"mid"<<endl; return (offsetMid+1); } if(*(start+offsetMid) > target){ cout<<"left"<<endl; tail = start+(offsetMid-1)*sizeof(int); return Search(target, start, tail); } if(*(start+offsetMid) < target){ cout<<"right"<<endl; start = start+(offsetMid)*sizeof(int); return Search(target,start , tail); } }
Но это не работает, я знаю, что параметр func лучше должен быть индексом массива, а не указателем, я просто хочу попробовать этот способ. Компилятор, который я использовал, это
gcc version 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC)Еще одна странная вещь
int offsetMid= (tail-start)/2/sizeof(int);//by unit of intИ tail, и start имеют тип int*, но разница между ними подсчитывается байтом, поэтому я должен разделить ее на sizeof(int), чтобы получить значение смещения.
if(*(start+offsetMid) > target)Но когда я хочу добавить значение смещения к стартовому адресу, чтобы получить значение в определенной позиции, я не должен определять время по sizeof(int).?
Что я уже пробовал:
Я попытался напечатать адреса как начальной, так и конечной точек, а также значение элемента в средней позиции.