Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL5 / lab5-algorithms / lab5-algorithm-sort.doc
Скачиваний:
18
Добавлен:
10.04.2015
Размер:
113.15 Кб
Скачать

Сортировка (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первыеmiddlefirstэлементов совпадают с результатом обработки той же последовательности алгоритмом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, остальные расположены в конце последовательности в произвольном порядке.

Соседние файлы в папке lab5-algorithms