Глава 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 приведен заголовочный файл, содержащий несколько определений функций.

h05211.jpg

1: // SORTS.H — Несколько родовых функций сортировки.

2: ftifndef _SORTS_H

3: #define _SORTS_H

4: ^include <string.h>

5: #define SIZEOF( array) sizeof( array) / sizeof( array[0];