Существует метод bsearch()
в том же <stdlib.h>
, как указано здесь , здесь и здесь .
Функция bsearch()
использует алгоритм двоичного поиска, чтобы найти элемент, который соответствует ключу в отсортированном массиве из n элементов размера размера.(Тип size_t определен в <stdlib.h>
как unsigned int.) Последний аргумент compare
дает bsearch()
указатель на функцию, которую он вызывает для сравнения ключа поиска с любым элементом массива.Эта функция должна возвращать значение, указывающее, является ли ее первый аргумент, ключ поиска, меньшим, равным или большим, чем ее второй аргумент, элементом массива для проверки.
Обычно следует использовать qsort()
до bsearch()
, поскольку массив должен быть отсортированным (должен быть в порядке возрастания, упорядочен по тем же критериям, что и compare
) перед поиском.Этот шаг необходим, потому что алгоритм двоичного поиска проверяет, является ли ключ поиска выше или ниже среднего элемента в массиве, затем удаляет половину массива, проверяет середину результата, снова удаляет половину и т. Д.Если вы определяете функцию сравнения для bsearch()
с одинаковыми типами для двух аргументов, то qsort()
может использовать одну и ту же функцию сравнения.
Функция bsearch()
возвращает указатель на найденный элемент массива, который соответствуетключ поиска.Если соответствующий элемент не найден, bsearch()
возвращает нулевой указатель. [a]
Пример использования :
/* bsearch example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort, bsearch, NULL */
int compareints (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int values[] = { 50, 20, 60, 40, 10, 30 };
int main ()
{
int * pItem;
int key = 40;
qsort (values, 6, sizeof (int), compareints);
pItem = (int*) bsearch (&key, values, 6, sizeof (int), compareints);
if (pItem!=NULL)
printf ("%d is in the array.\n",*pItem);
else
printf ("%d is not in the array.\n",key);
return 0;
}
Вывод:
40 находится в массиве.
В ответ на комментарий ниже о том, как найти первый элементэто меньше / больше чем key
, вот ( возможно грязный ) обходной путь: вы можете перебрать отсортированный массив и сравнить его элементы с key
, используя ту же самую функцию compare
, переданную этомуметод, пока вы не найдете элемент меньше / больше, чем key
.