- •Овсянник в.Н. Лабораторные работы по курсу «Объектно-ориентированное программирование»
- •1.Интегрированная среда mvs-2010
- •1.1.Методические указания
- •2.Массивушки и подпрограммочки
- •Прочитайте это задание и методические указания до конца, прежде чем терзать клавиатуру, соседа, преподавателя и пр. Сущности
- •Попробуйте сдать работу, предварительно тщательно протестировав ее на предмет отсутствия хомутов
- •2.1.Методические указания
- •3.Поиск экстремумов с ограничениями или «Брачное агенство»
- •Постановка задачи
- •Задание
- •Листинг файла mAgency.Cpp (с главной функцией)
- •Листинг файла Lib.H
- •Листинг файла Lib.Cpp
- •4.Задача «куча камней»
- •4.1.Постановка задачи.
- •4.2.Методические указания.
- •Некоторые примеры разделения камней на две кучи, которые должна решать ваша программа
- •5.Разработка простого класса
- •5.1.Задание
- •5.2.Описание вариантов заданий
- •5.3.Драгоценные методические указания
- •6.Класс вектор
- •6.1.Пример класса tVector
- •6.2.Класс tVector с перегруженными операциями
- •7.Наследование классов
- •7.1.Задание
- •7.2.Методическая помощь
- •7.3.Описание самых легких вариантов заданий
- •7.4.Контроль качества выполненной работы
- •8.Приложение с окном вида
- •9.Абстрактные классы и виртуальные функции
- •9.1.Задание
- •9.2.Методические указания
- •Void PrintClassNamе1(cBasе *pb) // параметр-указатель
- •Void PrintClassNamе2(cBasе &b) // параметр-ссылка
- •Void PrintClassNamе3(cFirst f) // параметр-значение
- •9.3.Варианты заданий
- •10.Разработка класса контейнера
- •10.1.Задание
- •10.2.Описание вариантов заданий
- •10.3.Методические указания
- •12.Перегрузка векторных и матричных операций
- •12.1.Задание
- •12.2.Бесценные методические указания
- •12.3.Некоторые особенности перегрузки операций
- •12.4.Варианты заданий
- •13.Программирование односвязного списка
- •13.1.Задание
- •13.2.Описание вариантов заданий
- •14.Приложение, основанное на модальном диалоговом окне
- •14.1.Нудные методические указания Модальные и немодальные диалоговые окна
- •Ресурсы и элементы управления
- •Сценарий создания приложения
- •Разбор приложения
- •Усовершенствование приложения
- •15.Приложения
- •15.1.Виды сортировок
- •Классификация сортировок
- •Сортировка массивов
- •15.2.Алгоритм сортировки включением
- •Пример сортировки с помощью прямого включения
- •15.3.Сортировка Шелла
- •Список литературы
15.2.Алгоритм сортировки включением
Такой метод сортировки часто используется при игре в карты. Элементы (карты) мысленно делятся на «уже готовую» последовательность a1,..., аi-1 и исходную последовательность. При каждом шаге, начиная с i=2 и увеличивая i каждый раз на единицу, из исходной последовательности извлекается i-й элемент и перекладывается в готовую последовательность, при этом он вставляется на нужное место.
Пример сортировки с помощью прямого включения
Элементы массива: 44 55 12 42 94 18 06 67
i=2 44 55 12 42 94 18 06 67 (55 остался на месте)
i=3 12 44 55 42 94 18 06 67 (12 перешел на 1 ячейку)
i=4 12 42 44 55 94 18 06 67 (42 перешел на 2 ячейку)
i=5 12 42 44 55 94 18 06 67 (94 остался на месте)
i=6 12 18 42 44 55 94 06 67 (18 перешел на 2 ячейку)
i=7 06 12 18 42 44 55 94 67 (06 перешел на 1 ячейку)
i=8 06 12 18 42 44 55 67 94 (67 перешел на 7 ячейку)
Идея алгоритма этой сортировки такова:
{для каждого элемента, начиная со второго}
x := a[i];
включение x на соответствующее место среди a[1] … a[i];
В реальном процессе поиска подходящего места удобно, чередуя сравнения и движения по последовательности, как бы просеивать x, т.е. x сравнивается с очередным предыдущим элементом aj , а затем либо x вставляется на свободное место, либо aj сдвигается (передается) вправо и процесс «уходит» влево. Следует обратить внимание, что процесс просеивания может закончиться при выполнении одного из двух условий:
найден элемент aj со значением, меньшим, чем x;
достигнут левый конец готовой последовательности.
Это типичный пример цикла с двумя условиями окончания, что дает возможность применить известный прием фиктивного элемента («барьера»). Его можно реализовать, установив барьер a0 = x , для чего следует расширить диапазон индексов массива a [0..n].
15.3.Сортировка Шелла
В 1959 г. Д.Шеллом было предложено усовершенствование сортировки с помощью прямого включения. Суть метода в следующем: сначала отдельно группируются и сортируются элементы, отстоящие друг от друга на расстоянии 4. Такой процесс называется четверной сортировкой. После первого прохода элементы перегруппировываются. Теперь каждый элемент группы отстоит от другого элемента группы на две позиции - и элементы вновь сортируются. Это называется двойной сортировкой. И, наконец, на третьем проходе идет обычная, или одинарная сортировка.
Такой метод в результате дает упорядоченный массив, и видно, что каждый проход от предыдущего только выигрывает (так как каждая i-я сортировка объединяет две группы, уже отсортированные 2i-сортировкой). Очевидно, что расстояния в группах можно уменьшать по-разному, лишь бы последнее было единичным, ведь в самом плохом случае последний проход и сделает всю работу.
Пример сортировки
Исходный массив:
44 55 12 42 94 18 06 67
Четверная сортировка дает:
44 18 06 42 94 55 12 67
Двойная сортировка дает:
06 18 12 42 44 55 94 67
Одинарная сортировка дает:
06 12 18 42 44 55 67 94
На самом деле значение шага сортировки можно (и нужно) варьировать. В общем случае при сортировке Шелла сначала сравниваются и сортируются между собой значения, стоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений шага, а завершается сортировка Шелла упорядочиванием элементов при d=1 (то есть обычной сортировкой вставками). Эффективность сортировки Шелла в определённых случаях обеспечивается тем, что элементы «быстрее» встают на свои места.
Невзирая на то, что сортировка Шелла во многих случаях медленнее, чем быстрая сортировка, она имеет ряд преимуществ:
отсутствие потребности в памяти под стек;
отсутствие деградации при неудачных наборах данных — быстрая сортировка легко деградирует до сложности O(n²), что хуже, чем худшее гарантированное время для сортировки Шелла.
