C/C++

Напишите реализацию функции lower_bound на СИ в обобщенном виде

Аргументы функции:
int lower_bound(const void * searchkey, const void * baseptr, size_t number, size_t size, int(*funccompar) (const void *, const void *))
{
 int lower_bound(const void *searchkey, const void *baseptr, size_t number, size_t size, int(*funccompar) (const void *, const void *)) {
const char (*arr)[size] = baseptr; // Финт ушами: указатель на элемент длиной size
size_t left = 0, right = number - 1, pos = number;
while (left 0) {
right = middle - 1;
} else if (cmp == 0) {
right = middle - 1;
pos = min(middle, pos);
} else {
left = middle + 1;
}
}
return pos >= number ? -1 : pos;
}
Ты не написал[а], что именно требуется найти. Одного названия функции недостаточно.
Мой код ищет первое вхождение searchkey в отсортированном массиве baseptr.
АФ
Алеша Федоров
80 537
Лучший ответ
// Приводим указатели к типу char*
char* search = (char*)searchkey;
char* base = (char*)baseptr;

// Инициализируем переменные
int left = 0;
int right = number - 1;
int result = -1;

// Пока левая граница не пересечется с правой
while (left <= right) {
// Вычисляем средний элемент
int middle = (left + right) / 2;
// Получаем указатель на средний элемент
char* middle_elem = base + middle * size;
// Сравниваем средний элемент с искомым
int cmp = funccompar(search, middle_elem);
// Если средний элемент меньше или равен искомому
if (cmp >= 0) {
// Запоминаем его и продолжаем поиск в правой половине
result = middle;
left = middle + 1;
}
// Иначе ищем в левой половине
else {
right = middle - 1;
}
}

// Возвращаем индекс найденного элемента или -1, если не найден
return result;
}
Алексей Ерохин
Алексей Ерохин
14 368