Читаем C++ для начинающих полностью

((*pfCompare)[ 0 ])( string1, string2 ); // явная форма

<p>7.9.5. Параметры и тип возврата</p>

Вернемся к задаче, сформулированной в начале данного раздела. Как использовать указатели на функции для сортировки элементов? Мы можем передать в алгоритм сортировки указатель на функцию, которая выполняет сравнение:

int sort( string*, string*,

int (*)( const string , const string ) );

И в этом случае директива typedef помогает сделать объявление sort() более понятным:

// Использование директивы typedef делает

// объявление sort() более понятным

typedef int ( *PFI2S )( const string , const string );

int sort( string*, string*, PFI2S );

Поскольку в большинстве случаев употребляется функция lexicoCompare, можно использовать значение параметра по умолчанию:

// значение по умолчанию для третьего параметра

int lexicoCompare( const string , const string );

int sort( string*, string*, PFI2S = lexicoCompare );

Определение sort() выглядит следующим образом:

1 void sort( string *sl, string *s2,

2 PFI2S compare = lexicoCompare )

3 {

4 // условие окончания рекурсии

5 if ( si s1)

14 if ( low swap(*high);

16 else break;

17 } // end, for(;;)

18

19 s1-swap(*high);

20 sort( s1, high - 1 );

21 sort( high +1, s2 );

22 } // end, if ( si

sort() реализует алгоритм быстрой сортировки Хоара (C.A.R.Hoare). Рассмотрим

ее определение детально. Она сортирует элементы массива от s1 до s2. Это рекурсивная

функция, которая вызывает сама себя для последовательно уменьшающихся подмассивов.

Рекурсия окончится тогда, когда s1 и s2 укажут на один и тот же элемент или

s1 будет располагаться после s2 (строка 5).

elem (строка 6) является разделяющим элементом. Все элементы, меньшие чем elem,

перемещаются влево от него, а большие – вправо. Теперь массив разбит на две

части. sort() рекурсивно вызывается для каждой из них (строки 20-21).

Цикл for(;;) проводит разделение (строки 10-17). На каждой итерации цикла индекс

low увеличивается до первого элемента, большего или равного elem (строка 11).

Аналогично high уменьшается до последнего элемента, меньшего или равного elem

(строка 12). Когда low становится равным или большим high, мы выходим из цикла,

в противном случае нужно поменять местами значения элементов и начать новую

итерацию (строки 14-16). Хотя элементы разделены, elem все еще остается первым

в массиве. swap() в строке 19 ставит его на место до рекурсивного вызова sort()

для двух частей массива.

Сравнение производится вызовом функции, на которую указывает compare (строки

11-12). Чтобы поменять элементы массива местами, используется операция swap()

с аргументами типа string, представленная в разделе 6.11.

Вот как выглядит main(), в которой применяется наша функция сортировки:

#include

#include

// это должно бы находиться в заголовочном файле

int lexicoCompare( const string &, const string & );

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных