Аргументы функции:
int lower_bound(const void * searchkey, const void * baseptr, size_t number, size_t size, int(*funccompar) (const void *, const void *))
{
C/C++
Мой код ищет первое вхождение searchkey в отсортированном массиве baseptr.
Напишите реализацию функции lower_bound на СИ в обобщенном виде
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.
// Приводим указатели к типу 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;
}
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;
}
Похожие вопросы
- При совершении арифметических операций с переданными в рекурсивную функцию переменными, переменные меняются(Си)
- Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Как в функции распечатать двумерный динамический массив в Си
- Написать кусочек С++Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции
- Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде
- Вопрос по языку си. Написать функцию
- Функция уже имеет текст реализации
- Возвращение функции return func(); (Си)
- Что за число хранится в имени функции? (Си)