Как реализована функция bsearch() в стандартной библиотеке C?

Кто-нибудь знает, как реализована стандартная функция двоичного поиска?

Это прототип.

void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *) );

Мне действительно любопытно, как они использовали пустые указатели.

3 ответа

Решение

Я полагаю, вам интересно знать, как void * указатели используются в bsearch, а не сам алгоритм двоичного поиска. Прототип для bsearch является:

void *bsearch(const void *key, const void *base,
    size_t nmemb, size_t size,
    int (*compar)(const void *, const void *));

Вот, void * используется для поиска любого произвольного типа. Интерпретация указателей осуществляется (предоставляется пользователем) compar функция.

Поскольку указатель base указывает на начало массива, и элементы массива гарантированно будут смежными, bsearch может получить void * указатель на любой из nmemb элементы в массиве, делая указатель арифметики. Например, чтобы получить указатель на пятый элемент в массиве (при условии nmemb >= 5):

unsigned char *base_p = base;
size_t n = 5;
/* Go 5 elements after base */
unsigned char *curr = base_p + size*n;
/* curr now points to the 5th element of the array.
   Moreover, we can pass curr as the first or the second parameter
   to 'compar', because of implicit and legal conversion of curr to void *
   in the call */

В приведенном фрагменте мы не смогли добавить size*n прямо к base потому что это типа void *и арифметика на void * не определено.

Смотрите bsearch @ Google codesearch для различных реализаций bsearch,

Посмотрите на источник. Если у вас VS Standard или лучше, смотрите:

C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ crt \ src \ bsearch.c

Другие вопросы по тегам