Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ по алгоритм и структуре.doc
Скачиваний:
55
Добавлен:
07.08.2019
Размер:
1.34 Mб
Скачать

Принцип работы пирамидальной сортировки

Сначала производится просеивание – это первая часть алгоритма, а затем осуществляется основная сортировка – это вторая часть алгоритма.

Первая часть алгоритма. Первая часть алгоритма – просеивание, необходима для преобразования исходного массива в пирамиду, в которой каждый верхний элемент «опирается» на два меньших элемента. Эту часть назвали просеиванием, так как данная операция напоминает процесс разделения смеси на фракции в соответствии с их размерами, где сначала задерживаются большие частицы, а потом всё более мелкие.

Из рисунка 15.1 видно, что любой элемент a[i], где 1<=i<=n div 2, «опирается» на элементы a[2*i] и a[2*i+1]. Таким образом формируются тройки из элементов. Такой тройкой являются элементы a[6], a[12] и a[13].

Для просеянной пирамиды необходимо, чтобы выполнялось следующее условие – в каждой тройке максимальный элемент должен находиться «сверху», т.е. A[6] должен быть больше a[12] и a[13]. Исходный массив сначала может и не удовлетворять этому свойству, поэтому его немного перестраивают, т.е. Просеивают в соответствии с приведённым условием. В процессе просеивания изменяется последовательность элементов в массиве.

Начинается просеивание «снизу». Половина элементов с ((n div 2)+1)-го элемента по n-й элемент являются основанием пирамиды, их просеивать не нужно. Но для всех остальных элементов, продвигаясь от конца массива к его началу, проверяются тройки элементов a[i], a[2*i] и a[2*i+1], в которых перемещают максимальный элемент «наверх», т.е. В элемент a[i]. Если в результате такого одного прохода снизу вверх была нарушена пирамидальность в других ниже лежащих тройках элементов, то необходимо снова произвести просеивание, но уже сверху вниз к её основанию.

Вторая часть алгоритма. Для n-1 элементов, начиная с последнего, нужно осуществить следующие действия. Сначала нужно поменять местами очередной «рабочий» элемент с первым. Потом просеивается новый первый элемент сверху вниз так, чтобы не затрагивалось уже отсортированное основание, т.е. Элементы с i-го по n-й.

Первым рабочим элементом является n, а потом n-1, затем n-2 и т.д.

Во второй части алгоритма должно быть осуществлено n-1 перестановок. При первой перестановке самый верхний элемент становится последним элементом и становится первым элементом уже отсортированного основания. После второй перестановки другой верхний элемент перемещается на место предпоследнего элемента массива и так же входит в уже отсортированное основание. Процесс повторяется до тех пор пока в не отсортированной части не останется один самый маленький элемент. Такой способ просеивания помогает вытолкнуть на вершину пирамиды самый большой элемент, а потом его переместить в начало отсортированной последовательности, т.е. В её уже отсортированное основание.

Пример работы пирамидальной сортировки

Необходимо отсортировать массив 13, 0, 29, 56, 7, 15, 78. В дальнейшем на рисунках в этой лекции основание пирамиды – это цифры выделенные курсивом и жирным шрифтом, а уже отсортированная последовательность – цифры с подчёркиванием и жирным шрифтом. Элементы, которые меняются местами, выделяются серым тоном.

Получим просеянную начальную пирамиду (рис. 15.2), т.е. Осуществим первую часть алгоритма:

Далее вторая часть (рис. 15.3), где выполняются n-1=7-1=6 перемещений рабочего элемента в вершину с последующим просеиванием:

Блок-схема пирамидальной сортировки

На рисунке 15.5 приведена блок-схема алгоритма пирамидальной сортировки, а на рис. 15.6 приведена блок-схема алгоритма процедуры proseit_one_element, которая просеивает один элемент. Переменная b – это локальная переменная процедуры proseit_one_element, которой присваиваются при вызове данной процедуры значения сначала n, а потом i-1.

Эффективность алгоритма пирамидальной сортировки

Данная сортировка очень эффективно сортирует массивы большого размера и имеет сложность пропорциональную n*logn.

Ориентированные и неориентированные графы. Алгоритмы на графах

Что такое «графы»

Если требуется наглядно представить отношения между какими-либо объектами, то для этого используется естественная модель таких отношений – ориентированные и неориентированные графы.

Ориентированный граф. Эта структура так же называется орграф. Она состоит из множества вершин v и множества дуг e. Орграф через вершины и дуги определяют так g=(v, e).

Узлами называют вершины орграфа, а ориентированными ребрами – его дуги. Дугу можно представить в виде упорядоченной пары вершин (рис. 16.1), где v - начало, а w - конец дуги. Дугу записывают как vw или (v, w), а произносится это так: дуга ведёт от вершины v к вершине w или вершина w смежная с вершиной v.

Путь по орграфу от точки v1 до точки vn – это последовательность вершин v1, v2, ..., vn, для которой существуют дуги v1v2, v2v3, ...,vn-1vn. В этом случае длина пути будет равна n-1.

Если к вершинам или к дугам орграфа присоединены метки, то это помеченный орграф. Метка – это имя, вес (стоимость дуги), или значение какого-либо заданного типа

Неориентированный граф. Данная структура так же называется граф. Все выше приведённые определения для орграфа так же применимы и для графа с учётом некоторых особенностей. Граф в отличии от орграфа состоит из рёбер (v, w), которые соединяют неориентированные пары вершин (рис. 16.2). Такой граф обладает свойством (v, w)=(w, v), т.е. Значение метки для ребра не зависит от направления.

Чтобы можно было работать с графом, необходимо представить его в соответствующем виде, т.е. Придумать такую структуру, которая позволила бы составлять для графа алгоритмы и производить расчёты с использованием вычислительной машины.