Структуры данных и алгоритмы. Практическая работа. Простейшие алгоритмы сортировки: сортировка методом прямого обмена, прямой выборкой и вставкой

January 12, 2007



1) Необходимо создать реализацию функции, выполняющую сортировку массива символов (char) с помощью алгоритма сортировки прямой выборкой и вставкой. Проверить правильность работы алгоритма на примере строки текста вводимой пользователем с клавиатуры.

2) На основании ранее созданной функции сортировки создать ее реализацию в виде шаблонной функции, таким образом, мы сможем сортировать любые типы данных, для которых определены операции сравнения и копирования. Проверить правильность созданной шаблонной функции, выполнив сортировку массива целых чисел. Количество элементов 50, сами значения элементов должны генерироваться случайным образом в отрезке от 100 до 200.

3) Необходимо провести сравнительный анализ скорости работы не параметризированной и параметризированной версии функций для сортировки. Сортировке должны подлежать массивы символов (char). Значения данных массивов – это символы в интервале A-Z. Значения элементов должны генерироваться случайным образом. Результаты вывода работы программы должны быть в виде таблицы, например, так:
Количество элементов время, для не параметризированной версии время, для параметризированной версии
10 0 0
100 0 0
1000 .. ..
10 000 .. ..
100 000 .. ..
1 000 000 (правда время будет настолько велико, что …, пожалуй, остановитесь на 10^5) .. ..
4) Необходимо создать класс “Chuman”. Данный класс должен содержать информацию о человеке. Поля данного класса должны хранить информацию о его ФИО, возрасте, весе. Обязательно в состав данного класса следует ввести конструктор (для инициализации полей данного класса), операторы сравнения “>”/”<”, оператор присвоения. В качестве типа данных для хранения информации о ФИО человека рекомендуется применять класс string из библиотеки stl.

5) В программе создать массив из 5 элементов “Chuman” и выполнить их сортировку с помощью параметризированной версии функции. Необходимо вывести на экран элементы данного массива до сортировки и после сортировки. С этой целью Вам необходимо в состав класса “Chuman” ввести метод “printMe”, который и будет выводить информацию о человеке на экран в виде:
   “Chuman (fio=Vasyan Vasya; age=20; weight=87)”. 
При выполнении сортировки необходимо добиться упорядочения массива записей по полю ФИО, записи о людях должны быть расположены так, чтобы их фамилии были расположены в алфавитном порядке.

6) Продумать способ, как можно выполнять сортировку массива записей о людях по различным критериям. Пока на первый раз, для затравки, я предлагаю вам в качестве простейшего способа создать в составе класса “Chuman” статическое поле, например “m_mode”, типа:
  1. enum TT_SortType {
  2.  by_FIO,
  3.  by_AGE,
  4.  by_WEIGHT
  5. };
Предусмотреть возможность устанавливать значение данного поля с помощью статического метода, например
  1. setSortType(TT_SortType)
А в реализациях операторов сравнения выполнять сравнение в зависимости от значения данного поля, например: если поле равно m_mode == by_FIO, то сравнение должно идти по полю хранящему значение ФИО человека и т.д. для остальных полей.

Замечание: приведенная схема имеет ряд недостатков, поэтому если у Вас возникли идеи, почему и в чем недостаток схемы и возможные способы ее усовершенствования, то сообщайте мне (хорошие идеи будут вознаграждаться).

7) (Как часть данного задания было ваше д/з) Необходимо выполнить сортировку массива целых чисел (массив имеет размерность порядка 10^4 элементов, заполненных случайным образом) с помощью усовершенствованного алгоритма прямого обмена (оптимизация внешнего цикла, оптимизация внутреннего цикла до последней точки где был выполнен обмен). После того как была выполнена сортировка программа должна выполнить поиск случайного числа с помощью метода половинного деления. Накопите статистику о скорости работы алгоритма (оценка должна идти не в секундах или миллисекундах а в количестве операций деления) и проверьте насколько близки полученные результаты к эталонным log2n.

8) Создайте функцию, выполняющую сортировку массива целых чисел с помощью метода двоичной вставки. Определите для массива из 10^4 элементов количество операций сравнения и количество операций перемещения элементов между собой. Проверьте, как изменилось количество операций по сравнению с реализованном в первом задании алгоритме сортировки прямой вставкой.