Быстрая сортировка Хоара (Hoare C.A.R.) (алгоритм quicksort) Индекс А 12345678910 Значение ключа 23512457322821812 Индекс А 12345678910 Значение ключа.

Презентация:



Advertisements
Похожие презентации
СПИСКИ. СТЕК. ОЧЕРЕДЬ Варианты списков 1.Однонаправленные списки 1.1. Списки без заглавного звена... a n nil L a1a1 a2a2 Удаление 1 звена L a1a1 a 2...
Advertisements

Задание бинарных деревьев с помощью массивов Обходы деревьев.
К.Ю. Поляков, Е.А. Ерёмин, 2013 Программирование на языке Паскаль § 64. Сортировка 1.
Сортировка методом слияний Рекурсивная сортировка методом слияний.
ЗАПИСЬ ВСПОМОГАТЕЛЬНЫХ АЛГОРИТМОВ НА ЯЗЫКЕ Паскаль НАЧАЛА ПРОГРАММИРОВАНИЯ.
Обработка массивов Сортировка. Сортировка массивов «…создается впечатление, что можно построить целый курс программирования, выбирая примеры только из.
Обменные сортировки:BubbleSort Алгоритм прямого обмена основывается на сравнении и смене позиций пары соседних элементов. Процесс продолжается до тех пор.
МЕТОД ПОСЛЕДОВАТЕЛЬНОЙ ДЕТАЛИЗАЦИИ. ПРОЦЕДУРЫ И ФУНКЦИИ Урок 1.
Задачи поиска в структурах данных Поиск - нахождение какой-либо конкретной информации в большом объеме ранее собранных данных. Данные делятся на записи,
Тема: Комбинированный тип данных. Цель:. Комбинированный тип данных – это структурированный тип, состоящий из фиксированного числа компонент разного типа.
Тема: «Сортировка элементов одномерного массива» Автор: Андрюшина А.В. Школа 616 г. Зеленоград 2009 г.
Двоичные деревья поиска. Очередь с приоритетами Федор Царев Спецкурс «Олимпиадное программирование» Лекция , Санкт-Петербург, Гимназия.
Таблицы (tables) Таблица - это совокупность записей, каждая из которых состоит из двух полей - ключа и тела: причем ключи обязательно должны быть различными:
Что такое структурный подход в программировании? Как он реализуется в ЯП Паскаль? Что такое процедура? Кто дает название процедуре? Где записывается процедура?
Основы структурного программирования. Их удобно использовать, когда в программе несколько раз решается одна и та же подзадача, но для разных наборов данных.
К.Ю. Поляков, Е.А. Ерёмин, 2013 Программирование на языке Паскаль § 64. Сортировка 1.
1 Записи 2 Запись – это тип данных, который может включать в себя несколько полей – элементов разных типов (в том числе и другие структуры). Свойства:
Рекурсия Презентация разработана учителем информатики лицея 124 г.Барнаула Воловиковой Л.Л.
Записи в Паскале. НАЗВАНИЕДлина, байт Диапазон значений Byte10…255 ShortInt1-128…+127 Word20…65535 Integer … LongInt …
Алгоритмы сортировки. 2 Сортировка Сортировка – это расстановка элементов массива в заданном порядке (по возрастанию, убыванию, последней цифре, сумме.
Транксрипт:

Быстрая сортировка Хоара (Hoare C.A.R.) (алгоритм quicksort) Индекс А Значение ключа Индекс А Значение ключа л п Индекс А Значение ключа л п

Индекс А Значение ключа л п Индекс А Значение ключа пл

function findpivot ( i,j : integer) : integer; var firstkey : тип_ключа; k: integer; begin firstkey:= A[i].key; for k:= i+1 to j do if A[k].key > firstkey then begin findpivot:=k; exit end else if A[k].key < firstkey then begin findpivot:=i; exit end; findpivot:=0; end; function partition ( i,j : integer; pivot : тип_ключа ) : integer; var l, r : integer; begin l:=i; r:=j; repeat swap (A[l], A[k] ); {Написать самостоятельно процедуру обмена двух записей таблицы} while A[l].key < pivot do l:=l+1; {Проход слева} while A[r].key >= pivot do r:=r-1; {Проход справа} until l > r; partition:=l end;

procedure qicksort ( i,j : integer) ; {Сортировка элементов массива A[i], …, A[j] } var pivot : тип_ключа; pivotindex : integer; k : integer; begin pivotindex := findpivot (i,j); if pivotindex <> 0 then beginpivot := A[pivotindex].key; k:= portition (i,j, pivot); quicksort( i, k-1); {рекурсивно применяем функцию к левому множеству элементов} quicksort( k, j); { рекурсивно применяем функцию к левому множеству элементов } end end;

Двоичные (бинарные) деревья (binary trees) Иван Зоя Вера Олег Нина Петр ветви вершины Петр корень листья В общем случае дерево определяется так: это совокупность вершин, связанных ветвями, причем из каждой вершины может выходить любое количество ветвей, но входить в каждую вершину должна только одна ветвь, за исключением одной вершины, называемой корнем, в которую не входит ни одна ветвь; при этом из корня должны быть доступны все остальные вершины дерева.

Представление двоичного дерева Петр Нина Олег nil Зоя nil nil Вера nil nil Иван nil Петр nil T type ТЭД =string[20]; {тип элементов дерева (любой)} адрес = вершина; вершина = record элем: ТЭД; влево, вправо: адрес end; дерево = адрес; var T: дерево;

a7 a6a5a4 a3a2 a1 Ива н Зоя Вера Олег Нин а Пет р p в a6a5 a3a2 a1 Олег Нин а Пет р p б a4 a3 a1 Пет р p а a2 Пример Требуется описать на Паскале процедуру Печ Лист(Т), которая выводит на экран имена из всех листьев непустого двоичного дерева Т – при просмотре этих листьев слева направо.

procedure Печ Лист(T: дерево); var S: стек; {любое представление, ТЭС=адрес} p: адрес; begin Нач УстСтека(S); p:=T; {по условию задачи p nil} repeat if p.влево<>nil then {есть путь влево} begin if p.вправо<>nil then ВСтек(p.вправо,S); p:=p.влево end else {нет пути влево} if p.вправо<>nil then p:=p.вправо {есть путь вправо} else {p - лист} begin write(p.элем); if Пустой Стек(S) then p:=nil else Из Стека(S,p) until p=nil end;

Рекурсивный вариант просмотра двоичного дерева корень дерево procedure Печ Лист(T: дерево); begin if (T.влево=nil) and (T.вправо=nil) then write(T.элем) else {корень – не лист} begin if T.влево<>nil then Печ Лист(T.влево); if T.вправо<>nil then Печ Лист(T.вправо) end end;

Самостоятельно разобрать Пример. Требуется описать на Паскале процедуру По Уровням(Т), которая выводит на экран имена из всех вершин непустого двоичного дерева Т, так сказать, по уровням: сначала выводит имя из корня дерева, затем имена (слева направо) из всех вершин 2-го уровня, затем имена (также слева направо) из всех вершин 3-го уровня и т.д. Для нашего конкретного дерева должно быть выдано: Петр Нина Олег Вера Иван Петр Зоя Подсказка: для нерекурсивного варианта использовать как вспомогательную структуру данных - очередь

procedure По Уровням(T: дерево); var Q: очередь; {любое представление, ТЭО=адрес} p: адрес; begin Нач УстОчереди(Q); Вочередь(T,Q); {корень -> очередь} repeat Из Очереди(Q,p); write(p.элем); if p.влево<>nil then ВОчередь(p.влево,Q); if p.вправо<>nil then ВОчередь(p.вправо,Q) until Пустая Очередь(Q) end; В качестве самостоятельной работы: написать рекурсивный вариант этой процедуры