Алгоритм двоичного поиска C ++ для работы как lower_bound

У меня есть еще один вопрос после моего предыдущего —

Я создаю версию lower_bound с чем-то вроде бинарного поиска. С BinarySearch Функция Я нахожу место для вставки нового элемента и с помощью цикла for я перемещаю остальную часть массива и вставляю нужный элемент, чтобы я мог вставить его в нужную позицию.

Но следующее BinarySearch функция не работает должным образом.

Кто-нибудь может понять почему?

bool CReg::AddCar ( const char *name){
CArr * tmp = new CArr(name); // an item I am going to insert
int pos = BinarySearch(name,0,len); //len = number of items in array
checkLen(); // whether I do have enough space to move the array right
if (length!=0)
for (int i = m_len; i>=pos; i-- )
Arr[i+1] = spzArr[i];
Arr[pos] = tmp;
length++;
checkLen();
return true;
}

int BinarySearch(const char * name, int firstindex, int lastindex) {
if (lenght == 0) return 0; //number of items in array
if (firstindex == lastindex) return lastindex;
int tmp = lastindex - firstindex;
int pos = firstindex + tmp / 2; //position the new item should go to
if (tmp % 2)++pos;
if (lastindex == pos || firstindex == pos) return pos;
if (strcmp(name, Arr[pos]) < 0) return BinarySearch(name, firstindex, pos - 1);
if (strcmp(name, Arr[pos]) > 0) return BinarySearch(name, pos + 1, lastindex);
return pos;
}

0

Решение

Исправленная версия BinarySearch

int BinarySearch(const char* name, int firstindex, int lastindex)
{
if (firstindex == lastindex) return lastindex;
int dist = lastindex - firstindex;
int mid = firstindex + dist / 2; //position the new item should go to
if (strcmp(name, Arr[mid]) < 0) return BinarySearch(name, firstindex, mid);
if (strcmp(name, Arr[mid]) > 0) return BinarySearch(name, mid + 1, lastindex);
return mid;
}

Но вы можете напрямую использовать std::lower_bound:

// Assuming std::vector<std::string> Arr;

void CReg::AddCar(const std::string& name)
{
auto it = std::lower_bound(Arr.begin(), Arr.end(), name);
Arr.insert(it, name);
}
0

Другие решения


По вопросам рекламы [email protected]