4 - сортировка одномерного числового массива

Лабораторная работа 4 для студентов курса “Основы программирования” 1 курса кафедры ИУ5 МГТУ им Н.Э. Баумана.

Содержание

Цель работы

Познакомиться с массивами и методами работы с ними. Научиться вручную динамически выделять и освобождать память на куче. Освоить самые тривиальные алгоритмы сортировки массивов и оценить их алгоритмическую сложность.

Начало работы

Зайдите в свою локальную директорию с репозиторием для выполнения лабораторных работ. Заберите ветку с соответствующей лабораторной работой из общего репозитория (в лабораторной работе 0 был отмечен меткой upstream):

git pull upstream

или

git pull upstream lab_4

Переключитесь на ветку с текущей лабораторной работой:

git checkout lab_4

Свяжите ветку локального репозитория с вашим удаленным репозиторием:

git push --set-upstream origin lab_4

Указания по выполнению лабораторной работы

Для данной лабораторной работы действуют все требования, указанные в третьей лабораторной работе.

Общие советы

int arr[] = {1, 2};
// arr - адрес arr[0], arr == &arr[0], *arr == arr[0]
void Example() {
    int* p = new int{};
}
// значение p (адрес памяти, выделенной на куче через оператор new) утеряно, память освободить невозможно -> утечка памяти

Сортировка выбором (selection sort, min/max)

Алгоритм сортировки, имеющий худшее, среднее и лучшее время выполнения O(n²). Затраты памяти O(1).

Работает следующим образом:

  1. Находится минимальный (или максимальный) элемент в массиве;
  2. Найденное значение обменивается со значением первого (если ищется минимальный элемент) или последнего (если ищется максимальный элемент) неотсортированного элемента;
  3. Сортируется оставшаяся часть массива (отсортированные элементы не рассматриваются).

Сортировка пузырьком (bubble sort)

Алгоритм сортировки, имеющий худшее и среднее время выполнения O(n²). Лучшее время выполнения O(n). Затраты памяти O(1).

Работает следующим образом:

  1. В цикле попарно сравниваются элементы массива;
  2. Если первый элемент больше второго, то их значения обмениваются между собой;
  3. Цикл повторяется либо n - 1 раз, либо пока не обнаружится, что перестановки элементов больше не требуются.

Генератор псевдо-случайных чисел

В стандартной библиотеке C++ представлен заголовочный файл random, в котором содержатся инструменты для генерации псевдо-случайных чисел.

В самом простом случае для генерации случайных чисел в C++ достаточно 3 вещи:

Пример:

std::random_device r{}; // инициализация std::random_device
std::default_random_engine randomEngine(r()); // создание random engine с сидом, сгенерированным r
std::uniform_int_distribution distribution(1, 12); // равномерное распределение от 1 до 12
for (int i = 0; i < 100; ++i) {
    std::cout << distribution(randomEngine) << std::endl;
} // выведет 100 равномерно распределенных псевдо-случайных чисел от 1 до 12

Задание

Реализовать следующие методы сортировки массивов:

Заполнить массив рандомными элементами (целые числа, равномерное распределение от 0 до 99).

Для статических массивов небольшого размера (5-10 элементов):

Для динамических массивов:

Вывод должен быть оформлен в виде отформатированной таблицы.

Проанализировать быстродействие алгоритмов сортировки (на основе количества перестановок и сравнений).