Issuu on Google+

Гомельская научно-практическая конференция школьников по естественно-научным направлениям

«Поиск» ГУО «Залесская средняя школа»

Учебно-исследовательская работа

«Поиск наиболее оптимального метода

сортировки для решения сложных задач по программированию »

Ученика 11 класса ГУО «Залесская средняя школа» Ариновича Владимира Сергеевича Научный руководитель – учитель математики и информатики ГУО «Залесская средняя школа» Урбанчик Анна Игоревна

д .Залесье, 2


Содержание Введение

3

1. Сортировка. Алгоритмы сортировок и их свойства

5

2. Методы сортировки массива

6

2.1.

Простые методы сортировки массива

6

2.1.1. Сортировка с помощью прямого включения

6

2.1.2. Сортировка с помощью прямого выбора

7

2.1.3. Сортировка с помощью прямого обмена

8

2.2.

Улучшенные методы сортировки массивов

2.2.1. Метод Шелла

9 9

2.2.2. Сортировка с помощью двоичного дерева

10

2.2.3. Сортировка с помощью разделения

11

2.3.

Сравнение методов сортировки массивов

12

Заключение

15

Список используемых источников

16

Приложения

2


Введение Нет

дела

более

трудного

по

замыслу, более сомнительного по успеху, более опасного при осуществлении, чем вводить новые порядки. Никколо Макьявелли, "Государь" (1513) Данная

исследовательская

работа

посвящена

выбору

наиболее

оптимального метода сортировки в программировании. Представьте, насколько трудно было бы пользоваться словарем, если бы слова в нем не располагались в алфавитном порядке. Точно так же от порядка, в котором хранятся элементы в памяти ЭВМ, во многом зависит скорость и простота алгоритмов, предназначенных для их обработки. Так и при составлении алгоритмов решения олимпиадных задач по программированию немаловажную роль играет скорость выполнения алгоритма. Вот некоторые из наиболее важных применений сортировки: 1)

Решение задачи "группировки", когда нужно собрать вместе все

элементы с одинаковым значением некоторого признака. Допустим, имеется 10000 элементов, расположенных в случайном порядке, причем значения многих из них равны; и предположим, нам нужно переупорядочить файл так, чтобы элементы с равными значениями занимали соседние позиции в файле. Если два или более файла отсортировать в одном и том же порядке, то можно отыскать в них все общие элементы за один последовательный просмотр всех файлов, без возвратов. Оказывается, что, как правило, гораздо экономнее просматривать список последовательно, а не перескакивая с места на место случайным образом, если только список не настолько мал, что он целиком помещается в оперативной памяти. Сортировка позволяет использовать последовательный доступ к большим файлам в качестве приемлемой замены прямой адресации.

3


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

и свойства

различных алгоритмов сортировки. Актуальность исследования обусловлена ежегодным усложнением заданий по программированию, в частности, олимпиадных, что требует заранее знать наиболее оптимальные алгоритмы из часто встречающихся задач. Цель. Рассмотреть методы внутренней сортировки, и выбрать наиболее оптимальный алгоритм сортировки. Задачи: 1. Дать общую характеристику выбранным алгоритмам сортировки. 2. Рассмотреть свойства каждого алгоритма (выделить положительные и отрицательные стороны работы алгоритма) сортировки и отнести его к определенной группе сортировок. Для примера необходимо взять один тот же массив данных. 3. Проверить на практике эффективность выбранного теоретически оптимального алгоритма сортировки и показать практическое его применение. Объект исследования: алгоритмы внутренней сортировки. Предмет исследования: свойства алгоритмов внутренней сортировки.

4


1 Сортировка. Алгоритмы сортировок и их свойства В

общем

сортировку

следует

понимать

как

процесс

перегруппировки заданного множества объектов в некотором определенном порядке. Цель

сортировки – облегчить последующий

поиск

элементов в

таком отсортированном множестве. Мы встречаемся с отсортированными объектами

в

телефонных

книгах, в

списках

подоходных

налогов, в

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

тому

же

на

примерах

сортировок

можно

показать, как

путем

усложнения алгоритма, хотя под рукой и есть уже очевидные методы, можно добиться значительного выигрыша в эффективности. Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. Выбор алгоритма зависит от структуры обрабатываемых данных – это почти закон, но в случае сортировки такая зависимость столь глубока, что соответствующие методы разбиты на два класса – сортировку массивов и сортировку файлов. При решении задач по программированию мы чаще всего сталкиваемся с сортировкой массивов (внутренней), на ней мы остановимся более подробно. И именно среди алгоритмов внутренней сортировки отберем наиболее оптимальный для решения задач. Основным критерием для оценки алгоритма сортировки служит время —

основной

параметр,

характеризующий

быстродействие

алгоритма.

Называется также вычислительной сложностью. Для упорядочения важны худшее, среднее и лучшее поведение алгоритма в терминах мощности входного множества A. Если на вход алгоритму подаётся множество A, то обозначим n = |A|. Для типичного алгоритма хорошее поведение — это O(n*log(n)) и плохое поведение — это O(n2). Идеальное поведение для упорядочения — O(n).

5


2. Методы сортировки массивов 2.1. Простые методы сортировки массивов К простым внутренним сортировкам относят методы, сложность которых пропорциональна квадрату размерности входных данных. Иными словами, при сортировке массива, состоящего из n компонент, такие алгоритмы будут выполнять С*n2 действий, где С - некоторая константа показывающая количество действий по поиску и перемещению элемента на нужное место. Количество действий, необходимых для упорядочения некоторой последовательности данных, конечно же, зависит не только от длины этой последовательности, но и от ее структуры. Например, если на вход подается уже упорядоченная последовательность, то количество действий будет значительно меньше, чем в случае перемешанных входных данных. 2.1.1. Сортировка с помощью прямого включения. Такой метод широко используется при игре в карты. Элементы мысленно делятся на уже “готовую” последовательность а 1, … , аi-1 и исходную последовательность. При каждом шаге, начиная с

i = 2 и

увеличивая i каждый раз на единицу, из исходной последовательности извлекается i-й элементы и перекладывается в готовую последовательность, при этом он вставляется на нужное место. Таблица 2.1. Пример сортировки с помощью прямого включения Начальные ключи i=2 i=3 i=4 i=5 i=6 i=7 i=8

44 44 12 12 12 12 06 06

55 55 44 42 42 18 12 12

12 12 55 44 44 42 18 18

42 42 42 55 55 44 42 42

94 94 94 94 94 55 44 44

18 18 18 18 18 94 55 55

06 06 06 06 06 06 94 67

67 67 67 67 67 67 67 94

6


В таблице 2.1. показан в качестве примера процесс сортировки с помощью

включения

восьми

случайно

выбранных

чисел. Алгоритм

сортировки с помощью прямого включения представлен в приложении 1.1. Анализ метода прямого включения. Общее число сравнений и число пересылок можно найти по следующим формулам Cavg = (n2+n-2)/4, Mavg = (n2+9*n-10)/4. В нашем примере размерность массива равна 8 (n=8), поэтому Cavg = 18, Mavg = 32. 2.1.2.Сортировка с помощью прямого выбора Этот прием основан на следующих принципах: 1. Выбирается элемент с наименьшим ключом. 2. Он меняется местами с первым элементом а1. 3. Затем этот процесс повторяется с оставшимися n-1 элементами, n2 элементами и т.д. до тех пор, пока не останется один, самый большой элемент. Процесс работы этим методом с теми же восемью ключами, что и в таблице 2.1., приведен в таблице 2.2. Алгоритм формулируется так: FOR i:= 1 TO n-1 DO Присвоить k индекс наименьшего из a[i] … a[n]; Поменять местами a[i] и a[k]; END. Таблица 2.2. Пример сортировки с помощью прямого выбора Начальные ключи 44 55 12 42 94 18 i=2 06 55 12 42 94 18 i=3 06 12 55 42 94 18 i=4 06 12 18 42 94 55 i=5 06 12 18 42 94 55 i=6 06 12 18 42 44 55 i=7 06 12 18 42 44 55 i=8 06 12 18 42 44 55 Программа этого метода представлена в приложении 1.2.

06 44 44 44 44 94 94 67

67 67 67 67 67 67 67 94

7


Анализ прямого выбора. Число сравнений ключей , очевидно не зависит

от

начального

порядка

ключей. Количество сравнений

-

(n-

1)*(n+2)/2, количество пересылок элементов массива будет равным 3*(n-1). Для нашего примера Cavg = 32, Mavg = 21. 2.1.3. Сортировка с помощью прямого обмена Как и в методе прямого выбора, мы повторяем проходы по массиву, сдвигая каждый раз наименьший элемент оставшейся последовательности к левому концу массива. Если мы будем рассматривать как вертикальные, а не горизонтальные построения, то элементы можно интерпретировать как пузырьки в чане с водой, причем вес каждого соответствует его ключу. Таблица 2.3. Пример пузырьковой сортировки Начальные ключи i=2 i=3 i=4 i=5 i=6 i=7 i=8 Такой метод

44 55 06 44 06 12 06 12 06 12 06 12 06 12 06 12 сортировки

12 42 55 12 44 55 18 44 18 42 18 42 18 42 18 42 известен

94 18 42 94 18 42 55 42 94 55 44 55 44 55 44 55 под именем

06 67 18 67 94 67 94 67 44 67 94 67 94 67 67 94 “пузырьковая

сортировка”. Программа этого метода представлена в приложении 1.3. Анализ пузырьковой сортировки. Число

сравнений

в

строго

обменном

алгоритме C = (n2 – n)/2, а минимальное, среднее и максимальное число перемещений элементов (присваиваний) равно соответственно

Mmin = 0,

Mavg = = 3*(n2 – n)/4, Mmax = 3*(n2 – n)/2. Для массива размерности 8 = 28, Mavg = 42.

Cavg

Фактически в пузырьковой сортировке нет ничего ценного,

кроме ее привлекательного названия. Далее мы рассмотрим три улучшенных метода: по одному для каждого из основных методов сортировки – включения, выбора и обмена. 2.2. Улучшенные методы сортировки массивов 2.2.1. Метод Шелла 8


В 1959 году Д. Шеллом было предложено усовершенствование сортировки с помощью прямого включения. Сначала отдельно сортируются и группируются элементы, отстоящие друг от друга на расстояние d (длина промежутка выбирается произвольно). В нашем примере восемь элементов, возьмем d=4, получаем, что каждая группа состоит из двух элементов. После первого прохода элементы перегруппировываются – теперь каждый элемент группы отстоит от другого на две позиции – и вновь сортируются. Это называется двойной сортировкой. На третьем подходе идет обычная или одинарная сортировка. На каждом этапе либо сортируется относительно мало элементов, либо элементы уже довольно хорошо упорядочены и требуют сравнительно немного перестановок. Таблица 2.5. Сортировка методом Шелла 44

55

12

Четверная сортировка дает 44 18 06 Двойная сортировка дает

42

94

18

06

67

42

94

55

12

67

06 18 12 42 44 55 94 67 Одинарная сортировка дает 06 12 18 42 44 55 67 94 Программа этого метода представлена в приложении 1.4. Анализ сортировки Шелла. Нам не известно, какие расстояния дают наилучший результат. Но они не должны быть множителями один другого. Полный анализ сортировки Шелла чрезвычайно сложен, и мы не собираемся на нем останавливаться, он описан в третьем томе книги Д. Кнута “Искусство программирования”, М., Мир. Было доказано, что сложность этого алгоритма в наихудшем случае при выбранных нами значениях шага равна O(n3/2). 2.2.2.Сортировка с помощью двоичного дерева Сортировка с помощью двоичного дерева— универсальный алгоритм сортировки, заключающийся в построении двоичного дерева поиска по ключам 9


массива (списка), с последующей сборкой результирующего массива путём обхода узлов построенного дерева в необходимом порядке следования ключей. Данная сортировка является оптимальной при получении данных путём непосредственного чтения с потока. Алгоритм: 1. Построение двоичного дерева. 2. Сборка результирующего массива путём обхода узлов в необходимом порядке следования ключей. Построение двоичного дерева:

44 5

1

4 4

5

2

1 2

42

94

18

06

67

5 5

0 6

4 2

9 4

1 8

6 7

Дерево строится по следующим принципам. В качестве корня создается узел, в который записывается первый элемент массива. Для каждого очередного элемента строится новый лист. Если элемент меньше значения в текущем узле, то для него выбирается левое поддерево, если больше или равен, значению в текущем узле, правое. Сборка результатов массива:

4 4 1 2

5 5

0 6

06 12

18

42

44

55

6 7

94

4 2 1 8

9 4 6 7

10


Программа этого метода представлена в приложении 1.5. Анализ

сортировки

с

помощью

двоичного дерева. Она очень

эффективна для большого числа элементов n, чем больше n, тем лучше она работает. Можно сделать вывод, что даже в самом плохом из возможных случаев двоичного дерева потребуется n*log(n) (логарифм по основанию 2) шагов. При n=8 потребуется 24 шага. Великолепная производительность в таких случаях – одно из привлекательных свойств двоичного дерева. 2.2.3. Сортировка с помощью разделения (быстрая сортировка) Этот улучшенный метод сортировки основан на обмене. Это самый лучший

из

всех

известных

на

данный

момент

методов сортировки

массивов. Его производительность столь впечатляюща, что изобретатель Ч. Хоар назвал этот метод быстрой сортировкой (Quicksort) . Быстрая сортировка состоит в том, что массив (В) делится на два подмассива B', B", и выбирается произвольный элемент исходного массива а ( В' – подмассив В с элементами, не большими элемента а, а В" - подмассив В с элементами, большими выбранного элемента а. 44

12 06

55

42 12

12

18 42

12

18

94

18

06

55

44

06

18

06

42

94

55

18

44

55

67 94

67

42

42

67

67

67

94

94

11


В списке B', B" элемент а расположен на месте, на котором он должен быть в результирующем отсортированном списке. Далее к подмассивам B' и В" снова применяется упорядочивание быстрой сортировкой, до тех пор, пока каждая из частей не будет состоять из одного-единственного элемента. Алгоритм

метода

сортировки

с

помощью

разделения

(быстрая

сортировка) описывается в приложении 1.6. Анализ метода быстрой сортировки. Этот метод является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена, известного, в том числе, своей низкой эффективностью. Принципиальное отличие состоит в том, что после каждого прохода элементы делятся на две независимые группы. Любопытный факт: улучшение самого неэффективного прямого метода сортировки дало в результате эффективный улучшенный метод. Лучший случай. Для этого алгоритма самый лучший случай — если в каждой итерации каждый из подмассивов делился бы на два равных по величине массива. В результате количество сравнений дает примерно n*lg(n) сравнений (17). Это дало бы наименьшее время сортировки. Среднее. Даёт в среднем O(n*log(n)) сравнений при упорядочении n элементов (24). В реальности именно такая ситуация обычно имеет место при случайном порядке элементов и выборе опорного элемента из середины массива либо случайно. Худший случай. Худшим случаем, очевидно, будет такой, при котором на каждом этапе массив будет разделяться на вырожденный подмассив из одного опорного элемента и на подмассив из всех остальных элементов. Такое может произойти, если в качестве опорного на каждом этапе будет выбран элемент либо наименьший, либо наибольший из всех обрабатываемых. Худший случай даёт O(n²) сравнений (64). 2.3. Сравнение методов сортировки массивов

12


Заканчивая наш обзор методов сортировки массивов, мы попытаемся сравнить

их

эффективность. Как

и

раньше, n – число

сортируемых

элементов, а C и M соответственно число необходимых сравнений ключей и число обменов. Для всех прямых методов сортировки можно дать точные аналитические формулы. Они

приводятся в таблице 2.6. Столбцы

Min, Avg, Max определяют соответственно минимальное, усредненное и максимальное

по

перестановкам

из

методов

нет

всем n

простых

n!(максимальное количество перестановок)

элементов

значений. Для

и

формул, поэтому сравнение их будем

точных

усовершенствованных

проводить по основному параметру характеризующему эффективность работы алгоритма сортировки. Таблица 2.6. Сравнение простых методов сортировки Прямое

C=

Min n-1

Avg (n2+n-2)/4

Max ((n2-n)/2)-1

включение Прямой выбор

M= C=

3*(n-1) (n-1)*(n+2)/2

(n2+9n-10)/4 (n-1)*(n+2)/2

(n2+3n-4)/2 (n-1)*(n+2)/2

Прямой

M= C=

3(n-1) (n2-n)/2

n*(ln n + 0.57) (n2-n)/2

n2/4 +3(n-1) (n2-n)/2

обмен

M=

0

(n2-n)*0.75

(n2-n)*1.5

Таблица 2.7. Время работы различных программ

Упорядоченны

Случайны

В обратном

й

й

порядке

n = 256 Сортировка прямым включением 0.02 Сортировка прямым выбором Сортировка прямым обменом Метод Шелла Сортировка двоичным деревом Быстрая сортировка n = 2048 Сортировка прямым включением Сортировка прямым выбором Сортировка прямым обменом

0.82

1.64

0.94 1.26 0.10 0.20 0.08

0.96 2.04 0.24 0.20 0.12

1.18 2.80 0.28 0.20 0.08

0.22 58.18 80.18

50.74 58.34 128.84

103.80 73.46 178.66 13


Метод Шелла Сортировка двоичным деревом Быстрая сортировка

0.80 2.32 0.72

7.08 2.22 1.22

12.34 2.12 0.76

В таблице 2.7. собраны времена (в секундах) работы, обсуждавшихся выше методов сортировки. Три столбца содержат времена сортировки уже упорядоченного

массива,

случайной

перестановки

и

массива,

расположенного в обратном порядке. В начале приводятся цифры для 256 элементов, а ниже – для 2048. Четко прослеживается

отличие простых

(квадратичных) методов от усложненных (логарифмических). Кроме того, заслуживают внимания следующие особенности: 1. Несложно заметить, что наилучшую скорость работы показал алгоритм сортировки с разделением, остальные алгоритмы показали не высокую скорость работы и применение их при разработке серьезных программ не допустимо. Следует заметить, что

время работы алгоритмов: прямого

включения, "пузырька", Шелла растет квадратично относительно роста размера упорядочиваемого

массива,

что

подтверждается

и

теоретическими

соображениями, известно, что скорость работы данных алгоритмов оценивается как O(n2). Сортировка методом Шелла показала вполне хорошие результаты, но при этом все таки худшие нежели сортировка методом бинарных деревьев. 2. Пузырьковая

сортировка

определенно

наихудшая

из

всех

сравниваемых. 3. Быстрая сортировка лучше в 2 – 3 раза, чем сортировка с помощью двоичного дерева. Она сортирует массив, расположенный

в

обратном

порядке, практически с той же скоростью, что и уже упорядоченный.

Заключение 14


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

улучшенные

методы

внутренней сортировки: прямое

включения,

двоичное включение, прямой выбор, прямой обмен, метод Шелла, метод бинарных деревьев, быструю сортировку. Наиболее оптимальным алгоритмом для

применения

программирования,

при

решении

олимпиадных

и

сложных

задач

является – быстрая сортировка, которая показывает

наилучшее время работы алгоритма не зависимо от того упорядочен массив уже или его элементы находятся в случайном порядке. Задачи поставленные перед началом исследовательской работы выполнены. Цель исследовательской работы достигнута. Алгоритмы сортировок представлены в виде программ, написанных на языке Pascal. Так же мы проанализировали эти методы, и выяснили, какие из них более эффективны и в каких случаях.

Список используемых источников 15


1. Климов, Касаткин, Мороз. Turbo Pascal 6.0. 2. Кнут Д. Искусство программирования для ЭВМ, - Том 3 , « Сортировка и поиск »). 3. Вирт Н.. Алгоритмы и структуры данных. 4. Боон К. Паскаль для всех.

Приложение 1.1 16


ПРОГРАММА 2.1.1.Сортировка с помощью прямого включения. PROGRAM SI; VAR I, J, N, X: INTEGER; A: ARRAY [0..50] OF INTEGER; BEGIN WRITELN (‘Введите длину массива’); READ(N); WRITELN(‘Введите массив’); FOR I:=1 TO N DO {цикл чтения элементов массива} READ(A[I]); FOR I:=2 TO N DO BEGIN {цикл перебора элементов массива} X:=A[I];{ заносим в буфер текущий эл-т массива} A[0]:=X; J:=I;{устанавливаем текущее место эл-та в массиве} WHILE X<A[J-1] DO {перемещаем элемент пока он меньше предстоящего} BEGIN A[J]:=A[J-1]; {устанавливаем текущее место эл-та в массиве} DEC(J); {уменьшаем j на 1,перемещаемся на один элемент назад по списку} END; A[J]:=X; {записываем элемент на его место} END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END.

Приложение 1.2 17


ПРОГРАММА 2.1.2. Сортировка с помощью прямого выбора. PROGRAM SS; VAR I,J,R,X,N: INTEGER; A:ARRAY [0..50] OF INTEGER; BEGIN WRITELN ('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]); FOR I:=1 TO N-1 DO BEGIN R:=I;{ записываем номер текущего элемента } X:=A[I];{ присваиваем x значение текущего элемента} FOR J:=I+1 TO N DO{цикл перебора элементов массива} IF A[J]<X THEN { пока текущий элемент не станет меньше выбранного} BEGIN R:=J; { записываем номер текущего элемента } X:=A[R]; { присваиваем x значение текущего элемента} END; A[R]:=A[I];{ ставим элемент на свое место } A[I]:=X; END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END.

Приложение 1.3 18


ПРОГРАММА 2.1.3. Пузырьковая сортировка. PROGRAM BS; VAR I, J, X, N: INTEGER; A: ARRAY [0..50] OF INTEGER; BEGIN WRITELN('Введите длину массива'); READ(N); WRITELN('Введите массив'); FOR I:=1 TO N DO {заносим элементы в массив} READ(A[I]); FOR I:=2 TO N DO FOR J:=N DOWNTO I DO {цикл перебора элементов массива в обратной последовательности}

IF A[J-1]>A[J] THEN {если текущий элемент больше следующего меняем их местами}

BEGIN X:=A[J-1]; {обмен элементов местами} A[J-1]:=A[J]; A[J]:=X; END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END.

Приложение 1.4 19


ПРОГРАММА 2.2.1. Сортировка Шелла. PROGRAM SHELLS; CONST T=4; H: ARRAY[1..4] OF INTEGER = (15,7,3,1,64,6,94,42); VAR

I,J,K,S,X,N,M:INTEGER;

A:ARRAY[-16..50] OF INTEGER; BEGIN WRITELN('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]); FOR M:=1 TO T DO BEGIN{цикл выбора каждого n-го эл-та} K:=H[M]; {присвоение значения текущего эл-та переменной k } S:=-K; FOR I:=K+1 TO N DO BEGIN {цикл перебора элементов массива} X:=A[I]; J:=I-K; IF S=0 THEN S:=-K; INC(S); {увеличение переменной s на 1} A[S]:=X; WHILE X<A[J] DO BEGIN {цикл поиска места текущему эл-ту} A[J+K]:=A[J]; J:=J-K; END; A[J+K]:=X; END; END; WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END. Приложение 1.5 20


ПРОГРАММА 2.2.2. Сортировка с помощью двоичного дерева. PROGRAM HEARSORT; VAR I,X,L,N,R:INTEGER; A:ARRAY[0..50] OF INTEGER; PROCEDURE SIFT(L,R: INTEGER); {процедура построения двоичного дерева} VAR I,J,X: INTEGER; BEGIN I:=L; J:=2*L; X:=A[L]; IF (J<R)AND(A[J]<A[J+1]) THEN INC(J); {добавление листа } WHILE (J<=R) AND (X<A[J]) DO BEGIN A[I]:=A[J]; A[J]:=X; I:=J; J:=2*J; IF (J<R) AND (A[J]<A[J+1]) THEN INC(J); END; END; BEGIN WRITELN('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]);{построение двоичного дерева} L:=(N DIV 2)+1; R:=N; WHILE L>1 DO BEGIN DEC(L); 21


SIFT(L,N);{вызов процедуры построения дерева с параметрами L,N } END; WHILE R>1 DO BEGIN{ обход двоичного дерева } X:=A[1]; A[1]:=A[R]; A[R]:=X; DEC(R); SIFT(1,R); END; WRITELN(‘Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END.

Приложение 1.6 22


ПРОГРАММА 2.2.3. Сортировка с помощью разделения. PROGRAM QS; VAR N,I:INTEGER; A:ARRAY[0..50] OF INTEGER; PROCEDURE SORT(L,R: INTEGER); VAR I,J,X,W: INTEGER; BEGIN I:=L; J:=R; X:=A[(L+R) DIV 2];{разделение массива} REPEAT WHILE A[I]<X DO INC(I); {перемещение текущего элемента по левую сторону} WHILE X<A[J] DO DEC(J); {перемещение текущего элемента по правую сторону}

IF I<=J THEN BEGIN W:=A[I]; {обмен элементов местами в следующих двух строках} A[I]:=A[J]; A[J]:=W; INC(I); DEC(J); END; UNTIL I>J; IF L<J THEN SORT(L,J);{рекурсия SORT} IF I<R THEN SORT(I,R); {рекурсия SORT} END; BEGIN 23


WRITELN('Введи длину массива'); READ(N); WRITELN('Введи массив'); FOR I:=1 TO N DO READ(A[I]); SORT(1, N); WRITELN('Результат:'); FOR I:=1 TO N DO WRITE(A[I],' '); END.

24


Учебно-исследовательская работа