Вызов стандартных функций сортировки и поиска.
На практике при работе с данными часто встречаются задачи сортировки массива и поиска элементов в отсортированном массиве. Причем массивы могут иметь разные типы. Чтобы облегчить решение таких задач, в стандартной библиотеке языка программирования Си есть специальные функции qsort и bsearch, которые предназначены для решения этих задач.
Функция qsort выполняют сортировку массива, элементы которого имеют произвольный тип. Эта функция реализует «быстрый алгоритм» сортировки массивов и имеет следующий прототип:
void qsort(void *base, size_t n, size_t size, int (*cmp) (const void *e1, const void *e2));
который описан в заголовочном файле stdlib.h. Кратко опишем назначение параметров этой функции:
base адрес массива,
n количество элементов в массиве,
size длина элемента массива,
cmp указатель на функцию сравнения, которая возвращает:
- отрицательное число, если элемент e1 меньше элемента e2;
- 0, если элемент e1 равен элементу e2;
- положительное число, если элемент e1 больше элемента e2.
Функция bsearch выполняет бинарный поиск элемента в отсортированном массиве. Эта функция имеет следующий прототип:
void* bsearch(const void *key, const void *base,
size_t n, size_t size, int (*cmp)(const void *ck, const void *ce);
который также описан в заголовочном файле stdlib.h. Первый параметр key этой функции является указателем на элемент, который нужно найти. Остальные параметры повторяют параметры функции qsort. В случае успешного завершения поиска функция bsearch возвращает адрес найденного элемента, а в случае неудачи NULL.
В следующей программе показан пример использования функций qsort и bsearch для сортировки целочисленного массива и дальнейшего поиска элементов в этом отсортированном массиве.
#include <stdio.h>
#include <stdlib.h>
/* функция для сравнения элементов массива */
int comp_int(const int* e1, const int* e2)
{
return (*e1 < *e2) ? -1 : ((*e1 == *e2) ? 0 : 1);
}
/* программа сортировки элементов массива и поиска целого числа в отсортированном массиве */
int main()
{
int n; /* размер массива *.
int* a; /* массив */
int i; /* индекс */
int k; /* число для поиска */
int* s; /* адрес найденного числа */
printf("Input an array size: ");
scanf("%d", &n);
a = (int*)malloc(n*sizeof(int));
/* вводим массив */
printf("Input elements: ");
for (i = 0; i < n; ++i)
scanf("%d", &a);
/* сортируем массив */
qsort(a, n, sizeof(int),
(int (*)(const void*, const void*))comp_int);
/* выводим отсортированный массив */
printf("The sorted array: ");
for (i = 0; i < n; ++i)
printf("%d ", a);
printf("\n");
/* вводим число для поиска */
printf("Input a number to search.\n>");
scanf("%d", &k);
/* ищем это число в отсортированном массиве */
if(!(s = (int*) bsearch(&k, a, n, sizeof(int),
(int (*)(const void*, const void*))comp_int)))
printf("There is no such an integer.\n");
else
printf("The integer index = %d.\n", s-a);
free(a);
return 0;
}
В функции сортировки использовать любой алгоритм сортировки.