Глава 19. Классы-шаблоны_________________________________521
#define SIZEOF ( array) sizeof (array)/sizeof (array[0]>
template <class T>
void Swap( T& a, T& b) { T t = a; a == b; b = a; }
template <class T>
inline int IsGreater( T& a, T& b) { return a > b ? 1 : 0; }
inline int IsGreater( char* a, char* b) ( return strcmpfa, b) > 0 ? 1 : 0; }
// Если необходимо, то можно заменить operator> на IsGreater
// При использовании сравнения на основе operator> удостоверьтесь,
// что операция определена для вашего типа данных
template <class T>
void GumSort( Т data [ ])
( "• .
// Макрос SIZEOF необходимо потому, что его значением // инициализируется константа, т. е. значение должно быть // известно во время компиляции const unsigned int MAX = SIZEOF ( t) ;
for ( int j = 0; j < MAX - 1; j++)]
for ( int k = j + 1; k < MAX; k++)
if ( data[j] > data[k]) Swap( data[j], data[kl);
Шаблон сортировки методом выбора
Причина, по которой сортировка методом выбора имеет несколько большую производительность, заключается в том, что перестановка выполняется только для оптимальной пары элементов и только однажды для каждой итерации. По-прежнему сравнивается п2 элементов, но перестановка выполняется не более п раз.
В предыдущем разделе был приведен листинг только самой сортировки. На этот раз мы рассмотрим полный листинг, включающий как заголовочный файл, так и модуль с испытательным стендом и несколькими функциями хронометража.
Поскольку производительность сортировки близка к предыдущей, то и реализация похожа — вложенный цикл for. Отличие заключается в том, что сначала из всех пар выбирается наиболее подходящая, а перестановка выполняется в конце. В листинге 19.3 приведен заголовочный файл, содержащий несколько определений функций.
1: // SORTS.H — Несколько родовых функций сортировки.
2: ftifndef _SORTS_H
3: #define _SORTS_H
4: ^include <string.h>
5: #define SIZEOF( array) sizeof( array) / sizeof( array[0];