- •Стандартные алгоритмы
- •Обрабатываемые последовательности
- •Нечто, что может быть вызвано как функция
- •Алгоритмы сортировки
- •Сортировка (sort)
- •Устойчивая сортировка (stable_sort)
- •Частичная сортировка (partial_sort)
- •Частичная сортировка с копированием (partial_sort_copy)
- •N-й элемент (nth_element)
- •Алгоритмы поиска
- •Нижняя граница (lower_bound)
- •Верхняя граница (upper_bound)
- •Область вставки (equal_range)
- •Двоичный поиск (binary_search)
Сортировка (sort)
template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last, Compare соmр);
Стандартная сортировка sortупорядочивает элементы в диапазоне[first, last) по возрастанию. Требует приблизительноN*Iog(N)(гдеNравняетсяlast – first, то есть общему числу элементов сортируемой последовательности) сравнений в среднем. В худшем случае потребуетсяN*Nсравнений. Алгоритмможет не сохранятьотносительный порядок равных элементов, т.е. если в несортированной последовательности были два равных элемента, то в отсортированной последовательности их порядок может измениться. Это не важно в случае сортировки целых чисел (два числа «2» неотличимы и перестановка их местами будет незаметна), однако это может иметь значение, если сортируются последовательности объектов, сравниваемой по одному из полей (два объекта с одинаковым значением поля, по которому происходит сравнение, и различными остальными полями не являются в общем случае равными и их перестановка при сортировке будет заметна, это может быть нежелательно).
Устойчивая сортировка (stable_sort)
template <class RandomAccessIterator>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Устойчивая сортировка stable_sortупорядочивает элементы в диапазоне[first, last). Данный алгоритм устойчив, то есть относительный порядок равных элементов сохраняется. ДелаетсяN*logN(гдеNравняетсяlast - first) сравнений; если недоступна достаточная дополнительная память, то число сравнений увеличивается доN*(log(N))2.
Частичная сортировка (partial_sort)
template <class RandomAccessIterator>
void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>
void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp);
Частичная сортировка partial_sort помещает первые middle - first упорядоченных элементов из диапазона [first, last) в диапазон [first, middle), остальная часть элементов в диапазоне [middle, last) помещена в неопределённом порядке, позиция итератора middle находится между first и last. Другими словами, после завершения работы алгоритмаpartial_sortпервыеmiddle – firstэлементов совпадают с результатом обработки той же последовательности алгоритмомsort, остальные элементы расположены в произвольном порядке. Производится приблизительно (last - first)* log(middle - first) сравнений.
Пример использования алгоритма partial_sort:
#include <algorithm>
#include <vector>
#include <iostream>
#include <cstdlib>
using namespace std;
void print_elem(int val)
{
cout << val << ", ";
}
int main()
{
vector<int> v;
int i;
for (i = 0; i < 20; i++)
v.push_back(rand()%20);
cout << "Initial seq: ";
for_each(v.begin(),v.end(),print_elem);
cout << endl;
partial_sort(v.begin(),v.begin()+7,v.end());
cout << "After partial_sort: ";
for_each(v.begin(),v.end(),print_elem);
cout << endl;
sort(v.begin(),v.end());
cout << "After sort: ";
for_each(v.begin(),v.end(),print_elem);
cout << endl;
return 0;
}
Вывод программы имеет вид:
Initial seq: 1, 7, 14, 0, 9, 4, 18, 18, 2, 4, 5, 5, 1, 7, 1, 11, 15, 2, 7, 16,
After partial_sort: 0, 1, 1, 1, 2, 2, 4, 18, 18, 14, 9, 7, 5, 7, 5, 11, 15, 4, 7, 16,
After sort: 0, 1, 1, 1, 2, 2, 4, 4, 5, 5, 7, 7, 7, 9, 11, 14, 15, 16, 18, 18,
Видно, что в результаты алгоритма partial_sortбыла отсортирована часть последовательности, первые 7 элементов совпадают с результатом работы алгоритмаsort, остальные расположены в конце последовательности в произвольном порядке.