504. Поиск в отсортированном массиве с использованием функции bsearch
В С489 мы видели, что при двоичном поиске в отсортированном массиве местоположение требуемого значения определяется путем деления пополам количества элементов исследуемого массива с каждой итерацией. Для операции двоичного поиска используется функция bsearch:
#include <stdlib.h>
void *lfind(const void *element, void *base,
size_t *number_of_entries, size_t element_width,
int (*compare)(const void *, const void *));
Как можно видеть, в функции очень часто используются указатели. Параметр element - указатель на значение, которое требуется найти. Параметр base - указатель на начало массива. Параметр number_of_entries - указатель на количество элементов массива. В параметре element_width указывается количество байтов, занимаемое каждым элементом массива. Наконец, параметр compare - указатель на другую функцию, которая сравнивает два элемента массива. В отличие функций, рассмотренных ранее и возвращающих индекс найденного элемента в массиве, функция bsearch возвращает указатель на элемент массива, содержащий требуемое значение или NULL, если значение не найдено. В следующей программе BSEARCH.C функция bsearch используется для поиска значения типа int и значения типа float:
#include <stdlib.h>
#include <stdio.h>
int compare_int(int *a, int *b)
{
return(*a - *b);
}
int compare_float(float *a, float *b)
{
return((*a == *b) ? 0: 1);
}
void main(void)
{
int int_values[] ={1,3,2,4,5);
float float_values[] = (1.1, 3.3, 2.2, 4.4, 5.5);
int *int_ptr, int_value = 2, elements = 5;
float *float_ptr, float_value = 33.3;
int_ptr = bsearch(&int_value, int_values,
elements, sizeof(int),
(int (*) (const void *, const void *)) compare_int);
if (*int_ptr)
printf("Значение %d найдено\n", int value);
else
printf("Значение %d не найдено\n", int_value);
float_ptr = bsearch(&float_value, float_values,
elements, sizeof(float),
(int (*) (const void *, const void *)) compare_float) ,
if (*float_ptr)
printf("Значение %3.1f найдено\n", float_value);
else
printf("Значение %3.1f не найдено\n", float_value);
}
Примечание: Для использования функции bsearch необходимо, чтобы значения элементов массива были отсортированы в порядке возрастания.
505. Сортировка массивов с использованием функции qsort
Из С498 нам известно, что при сортировке по методу быстрой сортировки массив рассматривается как список элементов. Метод быстрой сортировки путем разделения элементов массива на списки меньшего размера оказывается очень эффективным. Для того чтобы сортировать массивы всех типов с использованием алгоритма быстрой сортировки, библиотека Си предоставляет функцию qsort:
#include <stdlib.h>
void *qsort(void *base, size_t number_of_entries,
size_t element_width,
int (*compare)(const void *, const void *));
Как можно видеть, в прототипе функции очень часто используются указатели. Параметр base -указатель на начало массива. Параметр number_of_entries - указатель на количество элементов массива. В параметре element_width указывается количество байтов, занимаемое каждым элементом массива. Наконец, параметр compare - указатель на другую функцию, которая сравнивает два элемента массива следующим образом:
*а < *b // Возврат значения < О
*а == *а // Возврат О
*а > *b // Возврат значения > О
В следующей программе QSORT.C функция qsort используется для сортировки значений типа int и значений типа float:
#include <stdlib.h>
#include <stdio.h>
int compare_int(int *a, int *b)
{
return(*a - *b);
}
int compare_float( float *a, float *b)
{
if (*a < *b)
return(-1);
else if (*a == *b)
return (0);
else
return(1);
}
void main(void)
{
int int_values[] = (51, 23, 2, 44, 45);
float float_values[] = (21.1, 13.3, 22.2, 34.4, 15.5);
int elements = 5, i;
qsort(int_values, elements, sizeof(int),
(int (*) (const void *, const void *)) compare_int);
for (i = 0; i < elements; i++)
printf ("%d ", int_values[i]);
putchar('\n');
qsort(float_values, elements, sizeof(float),
(int (*) (const void *, const void *)) compare_float);
for (i = 0; i < elements; i++)
printf ("% 4.1f ", float_values[i]);