Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Определение функции сравнения




Решение.

Использование стандартной функции qsort

Функция qsort() предназначена для сортировки элементов массивов в порядке возрастания. Название qsort связано с первоначальной реализацией этой функции, в которой использовался алгоритм быстрой сортировки. В текущем стандарте не оговаривается, какой алгоритм сортировки должен использоваться. Рассмотрим вначале прототип этой функции.

#include <stdlib.h>
void qsort(void* base, size_t nmemb, size_t size,
int (* compar)(const void* p1, const void*p2));

Здесь:

· base – указатель на первый элемент массива, содержащего сортируемые элементы,

· nmemb – количество сортируемых элементов,

· size – размер памяти, занимаемый одним элементом,

· compar – указатель на функцию, выполняющую сравнение сортируемых элементов.

Остановимся отдельно на функции, которая должна выполнять сравнение. Эта функция должна получать два параметра, которые указывают на объекты, подлежащие сравнению. Эта функция должна возвращать отрицательное число, если первый элемент меньше второго, положительное число, если первое элемент больше второго и, наконец, возвращает нулевое число – в случае равентсва сравниваемых элементов.

Отметим универсальность функции qsort(). С помощью этой функции можно сортировать массивы с произвольным типом элементов массива. Универсальность функции обеспечивается использованием нетипизированных указателей.

Рассмотрим пример использования функции qsort().

Постановка задачи. Сортировать в порядке возрастания элементы массива ar. Массив состоит из n элементов типа double.

Напишем функцию пользователя compar (имя функции может быть и другим). Интерфейс разрабатываемой функции задается последним (четвертым) параметром функции qsort() и имеет следующий вид.

int compare(const void* p1,const void* p1);

Для упрощения алгоритма введем две вспомогательные переменные x1 и x2 типа double. Эти переменные должны представлять в разрабатываемой функции сравниваемые элементы массива. Для нахождения значений этих переменных необходимо нетипизированные указатели p1 и p2 преобразавать к указателям на тип сравниваемых элеменов (double*), а затем выполнить их разыменование. В результате можно получить следующее определение функции.

int compare(const void* p1, const void* p2)
{
double x1 = *(double*)p1;
double x2 = *(double*)p2;
if(x1 < x2)
return -1;
if(x1 > x2)
return 1;
return 0;
}

Клиентский код.

int compare(const void* p1, const void* p2);
int main(void)
{

double ar[] = {25, 4, 8, -1};
int n = sizeof(ar) / sizeof(*ar);
qsort(ar, n, sizeof(*ar), compar);
for(int i = 0; i < n; i++)
printf(“%0.4g”, ar[i]);
return 0;
}

Результат выполнения программы:

-1

 

 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 372; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.