- •1.Рекурсия: прямая и косвенная.
- •2. Объект. Способы описания. Инкапсуляция. Полиморфизм. Наследование.
- •1.Процедуры и функции.
- •2. Способы представления графов.
- •1.Структура Unit-a.
- •2.Введение в Delphi. Главное окно: пиктографические кнопки, палитра компонентов. Окна: формы, инспектора объектов, кода программы. Основы визуального программирования.
- •1.Организация библиотек. Стандартные библиотечные модули и модули пользователя.
- •1.Файлы в Паскале: текстовые файлы, типизированные файлы, нетипизированные файлы, их назначение и использование.
- •2. Построение остовного дерева поиском в глубину (нерекурсивный вариант).
- •1.Создание удобного пользовательского интерфейса: системы меню, окна для ввода, корректировки, просмотра информации. Модуль Crt.
- •2.Сортировка подсчетом
- •1.Стандартные процедуры и функции Unit Graph. Методы создания анимации.
- •2.Основы визуального программирования. Пустая форма и ее модификация. Компоненты страницы Standard. Размещение нового компонента.
- •1.Сортировка обменом
- •2.Объект. Конструктор и деструктор. Виртуальные функции.
- •1.Переменные действительного типа, их объявление и использование.
- •2. Сортировка выбором
- •1.Статическое и динамическое распределение памяти. Понятие указателя.
- •2.Процедуры и функции модуля graph.
- •1.Доступ к системным ресурсам. Определение переменной как absolute.
- •2.Процедуры и функции модуля crt, их использование.
- •1.Динамические структуры данных и их организация с помощью указателей.
- •2.Файлы без типа, их применение.
- •1.Введение в комбинаторику. Генерация k–элементного подмножества данного множества. Размещения. Сочетания.
- •2. Законы алгебры логики. Таблицы истинности.?????
- •1.Генерация всех перестановок n–элементного множества в антилексикографическом порядке.
- •2. Создание и обработка типизированных файлов.?????
- •1.Алгоритм генерирования перестановок с минимальным числом транспозиций.
- •2. Объявление массивов????
- •1.Введение в теорию графов. Способы представления графов: матрицы смежности и инцидентности, списки инцидентностей.
- •2.Функции библиотеки dos. Прерывания. Обработка прерываний.?????
- •1.Связные компоненты графа. Деревья. Бинарное дерево как связный граф без циклов.????
- •2. Сортировка вставками
- •1.Поиск в глубину в графе
- •2. Итерационные циклы
- •Цикл с предусловием. Оператор while ... Do.
- •Цикл с постусловием. Оператор repeat... Until.
- •Обозначение циклов на блок-схемах согласно госТу.
- •1.Поиск в ширину в графе
- •2. Оператор выбора case
- •1.Эйлеровы пути в графе.
- •2. Ввод-вывод с помощью текстовых файлов.
- •1.Алгоритмы с возвратом, их реализация с помощью рекурсий и с использованием стека. Гамильтоновы циклы.
- •2. Объект. Инициализация и разрушение объекта.
- •1.Кратчайшие пути. Алгоритмы Дейкстры, Флойда.
- •2.Процедурные типы. Передача функций как параметров.
- •1.Передача параметров вызываемым программам.?????
- •2. Объект. Свойства объектов.
- •1.Очереди и операции над ними.
- •2. Сортировка слиянием
- •1.Структурированные типы данных: массивы, символьные переменные и строки, множества.
- •1. Массивы.
- •2. Строковый тип данных.
- •3. Множества.
- •4. Записи.
- •2. Условный оператор.
- •1.Создание и обработка одномерных динамических массивов.
- •2. Операторы цикла.
- •1.Стеки и операции над ними.
- •2. Поразрядная сортировка
- •1.Процедуры и функции.
- •2. Бинарные деревья, их создание. Способы обхода дерева.
- •1.Односвязные линейные списки и операции над ними.
- •2. Записи. Организация, размещение. Записи с вариантами.??????
- •1.Двухсвязные линейные списки и кольца, операции над ними.
- •2. Затем создаём два указателя:
- •1.Обход списка в прямом направлении и его вывод на экран монитора:
- •2.Обход списка в обратном направлении и его вывод на экран монитора:
- •2. Сортировка и поиск информации. Методы внутренней сортировки.
2. Сортировка и поиск информации. Методы внутренней сортировки.
Существуют шесть основных идей внутренней сортировки: подсчетом, обменом, выбором, вставками, слиянием, распределением. Практически каждая из этих идей имеет несколько модификаций, некоторые из которых достаточно сложны для реализации.
Метод сортировки обменом
Рассмотрим один из методов сортировки – метод «пузырька» – один из вариантов обменной сортировки.
Данный алгоритм основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут рассортированы все элементы. Общий замысел любого алгоритма сортировки лучше всего раскрыть на конкретном примере сортировки последовательности целых чисел.
Итак, мы видим, что после первого просмотра наибольший по величине элемент занял свое место в конце массива; после второго – второй по величине элемент занял свое место и т.д.
Метод простого выбора. Данный метод основан на выборе самого маленького элемента последовательности и обмене его с первым элементом последовательности. Затем находится второй по величине элемент и меняется местами со вторым и т.д. После (n-1)-го просмотра все элементы займут свои места. Одним из улучшений данного метода является метод пирамидальной сортировки.
Метод простых вставокСогласно методу простых вставок элементы последовательности, начиная со второго, вставляются в уже упорядоченную подпоследовательность. Для того, чтобы не проверять сложное условие в цикле пока, очередной вставляемый элемент ставится на место нулевого и служит барьером, когда вставляемый элемент оказывается меньшим элементом подпоследовательности. Одновременно с поиском места вставки большие элементы сдвигаются на одну позицию к концу подпоследовательности. Одним из лучших методов сортировки является метод Шелла, который основан на методе простых вставок. Этот метод подобен методу Бэтчера, только подмассивы сортируются не методом обмена, а методом простых вставок.
Метод двухпутевых вставок
Считается, что слева и справа от первого элемента имеется n-1 свободное место, и вставляемые элементы сравниваются либо с последним вставленным элементом справа или слева. Этот выбор зависит от того, были ли сдвиги элементов на предыдущем шаге, если были, то направление вставки меняется на противоположное.
Метод бинарных вставок
В методе простых вставок для поиска места вставки выполняются последовательные сравнения вставляемого элемента с предыдущими элементами. Метод бинарных вставок основан на дихотомии, т.е. на бинарном методе поиска места. Например, если 63 элемента уже упорядочены и необходимо найти место 64-го, то 64-й сравнивается с 32-м, затем, в зависимости от результата сравнения, либо с 16-м, либо с 48-м. Таким образом, для нахождения места 64-го элемента достаточно выполнить всего шесть сравнений, а для нахождения места вставки, скажем, 1000-го – десять сравнений.
Метод подсчета
Заготавливаем n счетчиков и обнуляем их (можно заполнить единицами). Далее, сравниваем первый элемент с остальными и, в зависимости от того какой элемент больший, счетчик этого элемента увеличиваем на единицу. Затем второй элемент сравниваем с остальными, начиная с третьего и т.д. В результате, после сравнения (n-1)-го c n-м элементом, счетчики будут содержать номера элементов в отсортированной последовательности без единицы, если счетчики вначале обнулялись, и номера с единицей, если им были присвоены единицы. После этого достаточно одного цикла для получения нового упорядоченного массива из старого.
Метод слияния
Различают две модификации данного метода: простое двухпутевое слияние и естественное двухпутевое слияние. Идея метода основана на том, что если имеются два упорядоченных массива, то за один цикл их можно слить в один упорядоченный массив.
При простом слиянии исходный массив разбивается на n цепочек, в каждой из которых содержится по одному элементу. Далее выполняется слияние первой цепочки с последней, второй с предпоследней и т.д. Результаты цепочки в два раза длиннее, записываются поочередно в начало или в конец нового массива. Так как на каждом шаге слияния длины цепочек удваиваются, то достаточно выполнить log2n шагов.
Естественное двухпутевое слияние отличается от простого только первым шагом первоначальным разбиением на цепочки, которое выполняется естественным способом. Например, если исходная последовательность37 24 99 08 22 19 28 82,
то начальное разбиение на цепочки будет следующим:
37 | 24 99 | 08 || 22 || 19 | 28 | 82
Как видим, количество цепочек может быть значительно меньше n, что позволит несколько ускорить сортировку. То, что количество элементов в сливаемых цепочках различно, никакой роли при организации слияния не играет. В данном случае незначительно усложняется алгоритм из-за того, что один «средний» элемент может попасть в две цепочки (в нашем случае число 13).
Сортировка распределением
Рассмотрим частный случай сортировки распределением – поразрядную сортировку. Допустим, исходный массив состоит из двухразрядных десятичных чисел
37 24 99 08 22 19 28 82 50 64 11 71 95 76 04 13 81 45 53 17
Заготавливаем 10 карманов по n элементов каждый и выполняем распределение элементов исходного массива по карманам в зависимости от значения младшего разряда. В нашем случае это распределение будет следующим:
Карманы: 0 1 2 3 4 5 6 7 8 9
50 11 22 13 24 95 76 37 08 99
71 82 53 64 45 17 28 19
81 04
Берем последовательно элементы из карманов и получаем последовательность, упорядоченную по первому разряду,
50 11 71 81 22 82 13 53 24 64 04 95 45 76 37 17 08 28 99 19.
Эту последовательность снова упорядочиваем аналогично предыдущей последовательности, но по второму разряду.
Карманы: 0 1 2 3 4 5 6 7 8 9
04 11 22 37 45 50 64 71 81 95
08 13 24 53 76 82 99
17 28
19
Получим упорядоченную последовательность:
04 08 11 13 17 19 22 24 28 37 45 50 53 64 71 76 81 82 95 99.
Если элементы исходной последовательности содержат больше десятичных разрядов, то понадобится просто больше шагов распределения.
П р и м е ч а н и е. На самом деле нет необходимости заготавливать 10 карманов и распределять физически по ним элементы. Достаточно знать о каждом элементе, в какой карман он должен попасть, и по очереди выбирать их из этих виртуальных карманов.