Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
39
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 14. Алгоритмы

363

void nth_element(Ran first, Ran nth, Ran last. Compare comp);

partial^ sort, partial_sort_copy

Алгоритм partial_ sort также выполняет частичную сортировку последовательности. После выполнения алгоритма элементы от first до middle будут располагаться в таком же порядке, как после полной сортировки.

Алгоритм partial_sort_copy выполняет те же действия с копией последовательности.

tempiate<class Ran>

void partial_sort(Ran first, Ran middle, Ran last); tempiate<class Ran. class Compare>

void partial_sort(Ran first, Ran middle, Ran last. Compare comp); tempiate<class In, class Ran>

Ran partial_sort_copy(In first, In last, Ran result_first, Ran resultjast); tempiate<class In, class Ran, class Compare> Ran partial_sort_copy(In first, In last,

Ran result_first, Ran resultjast, Compare comp);

Частичная сортировка экономит время в тех случаях, когда нас интересуют только несколько самых больших или самых маленьких значений, например, «горячая десятка».

#include <iostream> #include <algorithm> using namespace std; int main(){

const int m = 8;

int a[m] = {3., 1. 2, 34, 8, 7, 20. 2};

int i;

partial_sort(a, a + 5. a + m, greater<int>0);

for (i =0; i < m; i++) cout « a[i] « " "; cout « endl; // 34 20 8 7 3 1 2 2

return"0;

partition, stable_partition

Алгоритм partition размещает элементы, удовлетворяющие заданному условию, перед остальными элементами. Алгоритм stable_partition выполняет то же самое, но с сохранением относительного порядка элементов. Условие задается с помощью функции или функционального объекта.

tempiate<class Bi. class Pred>

Bi partition(Bi first, Bi last. Pred pred); tempiate<class Bi. class Pred>

Bi stable_partition(Bi first, Bi last. Pred pred);

364

Часть III. Стандартная библиотека

sort, stable_sort

Алгоритм sort выполняет сортировку эффективную последовательности за время, пропорциональное N-log2N. Для сохранения порядка следования одинаковых элементов следует применять алгоритм stable_sort. Время его работы пропорционально N-(log2N)2.

tempiate<class Ran>

void sort(Ran first, Ran last); tempiate<class Ran, class Compare>

void sort(Ran first, Ran last, Compare comp); tempiate<class Ran>

void stable_sort(Ran first, Ran last); tempiate<class Ran, class Compare>

void stable_sort(Ran first, Ran last, Compare comp);

Обратите внимание на то, что этому алгоритму требуются итераторы произвольного доступа.

Алгоритмы работы с множествами и пирамидами

Алгоритмы этой категории выполняют сортировку множеств и операции с пирамидами. В первом случае отсортированная последовательность рассматривается как множество, а операции объединения и пересечения имеют тот же смысл, что в теории множеств. Приведенные алгоритмы не изменяют входные последовательности, а выходные последовательности упорядочены.

Пирамидой1 называется последовательность, для всех элементов которой выполняются условия:

a[i] < a[2*i + 1] a[i] < a[2*i + 2]

Пример пирамиды из 10 целых чисел: 23 20 21 17 19 18 15 12 10 14.

Как следует из определения, максимальный элемент пирамиды расположен первым, поэтому пирамиды удобно использовать для реализации очередей с приоритетами (см. с. 313), так как существуют эффективные алгоритмы извлечения первого элемента и добавления нового с сохранением условия пирамидальное™.

Для работы с пирамидой требуются итераторы произвольного доступа.

Так же, как и для других категорий алгоритмов, для каждого алгоритма существует две формы: одна использует операцию <, а другая — функцию сравнения, заданную пользователем.

1 Часто пирамиду изящно называют кучей (перевод английского слова heap).