Прототип функции bsearch:
void * bsearch( const void * searchkey, const void * baseptr, size_t number, size_t size, int ( * funccompar ) ( const void *, const void * ) );
| Название | Язык |
|---|---|
| stdlib.h | С |
| cstdlib | С++ |
Описание
Функция bsearch выполняет двоичный поиск в массиве.
Алгоритм поиска запрашивает искомое значение, которое передается через параметр searchkey, в массиве, на который ссылается указатель baseptr. Количество элементов массива передается через параметр number, каждый элемент массива имеет размер size байт. В конце, функция возвращает указатель void * на первое вхождение искомого значения.
Для выполнения поиска, функция сравнивает элементы с искомым элементом, путем вызова функции через параметр *comparator, указанного в качестве последнего аргумента.
Потому как эта функция выполняет алгоритм бинарного поиска, все значения в массиве baseptr должны быть отсортированы в порядке возрастания, с теми же критериями, которые использует функция funccompar.
Параметры:
- searchkey
Указатель на искомый объект типаvoid*. - baseptr
Указатель на первый элемент массива, в котором будет выполняться поиск, типаvoid*. - number
Количество элементов массиваbase. - size
Размер каждого элемента массиваbaseв байтах. - funccompa
Функция для сравнения двух элементов массива. Функция должна иметь следующий прототип:
int funccompar( const void * searchkey, const void * cmpelem );
Функция должна принимать два параметра: первый указывает на искомый объект, а второй — на один из элементов массива, типа void *. Функция должна привести передаваемые параметры к нужным типам данных и выполнить сравнение.
Возвращаемое значение этой функции неоднозначно. Если сравниваемый элемент с искомым значением меньше, равен или больше, функция должна вернуть, отрицательное значение, ноль или положительное значение, соответственно.
Для основных типов данных, которые поддерживают регулярные выражения, функция сравнения может выглядеть так:
int funccompar (const void * key, const void * cmpelem)
{
if ( *(type*)key > *(type*)cmpelem ) return 1;
if ( *(type*)key == *(type*)cmpelem ) return 0;
if ( *(type*)key < *(type*)cmpelem ) return -1;
}
Возвращаемое значение
Указатель на элемент массива, который равен значению в key.
Если искомый элемент не найден, возвращается нулевой указатель.
Пример: исходный код программы
//пример использования функции bsearch
#include <iostream>
#include <cstdlib>
int funccmp(const void * x1, const void * x2) // функция сравнения
{
return ( *(int*)x1 - *(int*)x2 ); // если результат вычитания - 0, значит числа равны
}
int values[] = { 10, 20, 25, 40, 90, 100 }; // отсортированный массив
int main()
{
int key = 40; // искомый элемент массива
int * ptrItem = (int*) bsearch(&key, values, 6, sizeof (int), funccmp);
if (ptrItem != NULL)
std::cout << "Число " << *ptrItem << " находится в массивеn";
else
std::cout << "Числа " << key << " в массиве нетn";
return 0;
}
Пример работы программы
В примере есть массив отсортированных целых чисел. Существует также функция funccmp, которая сравнивает два значения передаваемых через параметры x1 и x2, и возвращает результат вычитания значений. Если результат 0 — значения равны, положительный результат — сравниваемое значение меньше, отрицательный результат — сравниваемое значение больше.
В main вызывается функция bsearch для поиска в массиве values значение 40. Как только искомое значение найдено, программа выводит его на экран, смотреть пример работы программы ниже.
Для Си-строк функция strcmp может быть использована в качестве последнего аргумента функции bsearch.
Пример: исходный код программы
//пример использования функции bsearch, для поиска строки в массиве строк
#include <iostream>
#include <cstdlib>
#include <cstring>
char arraystr[][20] = {"галактика", "млечный", "путь", "вселенная", "космос"}; // массив строк
int main()
{
char key[20] = "путь";
// сортируем строки в массиве
qsort (arraystr, 5, 20, (int(*)(const void*, const void*)) strcmp);
std::cout << "Отсортированный массив строк:n";
for (int ix = 0; ix < 5; ix++)
std::cout << arraystr[ix] << " ";
// поиск строки
char * ptrItem = (char*) bsearch(key, arraystr, 5, 20, (int(*)(const void*,const void*)) strcmp);
if (ptrItem!=NULL)
std::cout << "nnСтрока "" << ptrItem << "" есть в массивеn";
else
std::cout << "nnСтроки "" << key << "" в массиве нетn";
return 0;
}
Пример работы программы
Отсортированный массив строк:
вселенная галактика космос млечный путь
Строка «путь» есть в массиве