§ 20. Использование библиотечных функций для сортировки и поиска данных
20.2. Сортировка
Для сортировки элементов вектора используется функция sort, которая имеет два параметра: границы сортируемого диапазона. Если в качестве границ диапазона использовать стандартные итераторы begin() и end(), то элементы вектора будут отсортированы в порядке возрастания. Если использовать итераторы rbegin() и rend(), то элементы будут отсортированы в порядке убывания. При этом вектор должен состоять из элементов, для которых определены операции сравнения: целых или вещественных чисел, символов, строк. Если вектор состоит из элементов, для которых не определено понятие порядка (структур или других векторов), то для их сортировки необходим третий параметр — функция-компаратор, которая задает отношения порядка для элементов. Пример 20.3. Дан линейный массив целых чисел. Написать программу, которая отсортирует числа в порядке убывания. Этапы выполнения задания I. Исходные данные: переменные n — количество чисел в массиве, a — массив. II. Результат: отсортированный массив. III. Алгоритм решения задачи. 1. Ввод исходных данных. Данные сгенерируем случайным образом. IV. Описание переменных: n – int, a – vector<int>. Для сортировки в порядке убывания можно воспользоваться стандартным компаратором, который задает порядок — большее раньше меньшего: sort(v.begin(), v.end(), greater<int>()); Кроме компаратора greater, могут использоваться компараторы: less (меньше), equal_to (равно), not_equal_to (не равно), less_equal (меньше либо равно), greater_equal (больше либо равно). Эти компараторы ассоциированы с типом своего параметра, для которого должны быть определены операции сравнения. По умолчанию работает компаратор less, который можно опускать. Пример 20.4. На плоскости заданы своими координатами n точек. Расположить точки в порядке возрастания их абсцисс. Найти все пары соседних точек, абсциссы которых находятся на расстоянии не меньше l друг от друга. Этапы выполнения задания I. Исходные данные: переменные n — количество точек в массиве, l — расстояние, a — массив. II. Результат: отсортированный массив. III. Алгоритм решения задачи. 1. Ввод исходных данных. |
В реализации Стандартной библиотеки шаблонов (STL) в C++ для реализации сортировки используется подход Дэвида Мюссера. В 1997 г. он предложил использовать интроспективную сортировку (Introsort). Это комбинированный алгоритм сортировки, который использует быструю сортировку и переключается на пирамидальную[1] сортировку, когда глубина рекурсии превысит логарифм от числа сортируемых элементов. В быстрой сортировке выбор опорного элемента производится как медианы из трех. Когда количество элементов становится меньше 16, применяется алгоритм сортировки простыми вставками. Таким образом, функция sort объединяет в себе три алгоритма сортировки: быструю, пирамидальную и сортировку простыми вставками. Функция гарантировано использует порядка операций сравнений и обменов. V. Программа:
VI. Тестирование. V. Программа:
VI. Тестирование. [1] Пирамидальная сортировка использует бинарное сортирующее дерево для хранения данных. Почитать о ней можно здесь: Кормен, Т. Алгоритмы: построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн., 3-е издание. — М.: «Вильямс», 2013. |