Перейти к содержанию

ДЗ Лабораторная работа №3 "Алгоритмы сортировки"#

Warning

За задание можно получить до 5 баллов, соблюдая следующие условия:
- Написано на C++ ( + 1 балл)
- Тестрование проводилось с использованием Unit-test ( + 1 балл)
- Задание зачтено ( +3 балла)

В отчете должно быть указано следующие:
1. Титульный лист, где указаны ФИО преподавателя, номер задания, номер варианта
2. Формулировка задания
3. Ссылка на github-репозиторий с работающим кодом
4. Блок-схема каждого алгоритма отдельно с описанием алгоритма
5. После каждого описания идет листинг кода
6. Пример входных и выходных данных (таблицей)
7. Произвести асимптотическую оценку (лучший случай, худший случай, средний случай)
8. В конце работы приводятся реальные замеры на вашем ЭВМ в виде таблицы и графика

Примечание 1: Для реализации Unit-test рекомендуется произвести тестрование при помощи assertEqual и Assert::Is

Примечание 2: Оси графиков должны быть подписаны — указаны название показателя и единицы его измерения. Например, «Время выполнения алгоритмы, с», «Количество элементов в массиве». Под графиком размещается подрисуночная подпись с пояснением зависимость какой величины от какого параметра на нем показана.

https://ratcatcher.ru/media/alg/practice/prac_5/dz_1.png

Описания алгоритмов#

Для реализации ниже дано словесное описание алгоритма и его псевдокод. Блок-схемы составляете самостоятельно, например, при помощи сервиса programforyou

Сортировка пузырьком#

Сортировка пузырьком — это простейший и один из самых известных алгоритмов сортировки. Идея заключается в последовательном сравнении значений соседних элементов. Если текущий элемент больше следующего, меняем их местами. Алгоритм необходимо повторять до тех пор, пока массив не будет отсортирован.

Функция пузырьковаяСортировка(массив):
    n ← длина(массив)
    для i от 0 до n - 2:
        для j от 0 до n - 2:
            если массив[j] > массив[j + 1] то:
                поменять местами(массив[j], массив[j + 1])
            конец если
        конец внутреннего цикла
    конец внешнего циикла
конец функции

Гномья сортировка#

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

Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на текущий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.

Функция гномьяСортировка(массив):
    i ← 1
    пока i < длина(массив):
        если i > 0 и массив[i - 1] > массив[i] то:
            поменять местами(массив[i - 1], массив[i])
            i ← i - 1
        иначе:
            i ← i + 1
    конец цикла
конец функции

Сортировка расческой#

Сортировка расческой — модификация пузырьковой сортировки, основанной на сравнении элементов на расстоянии.

Сортировка расческой — это улучшение сортировки пузырьком. Основная идея заключается в том, чтобы с каждым шагом уменьшать интервал, на котором происходят сравнения и обмены элементов, а не всегда сравнивать только соседние элементы, как в сортировке пузырьком. Начинаем с большого интервала (расстояния) между сравниваемыми элементами и постепенно уменьшаем его. Алгоритм продолжает работать до тех пор, пока не произойдут обмены на самом маленьком интервале, что гарантирует завершение сортировки.

Функция сортировкаРасческой(массив):
    n ← длина(массив)
    шаг ← n - 1  # Начальный шаг
    пока шаг > 1:
        шаг ← шаг // 1.3  # Уменьшаем шаг
        i ← 0
        пока i + шаг < n:
            если массив[i] > массив[i + шаг] то:
                поменять местами(массив[i], массив[i + шаг])
            конец если
            i ← i + 1
        конец цикла
    конец цикла
конец функции

Сортировка слиянием#

Сортировка слиянием — это эффективный алгоритм сортировки, который использует метод "разделяй и властвуй". Алгоритм рекурсивно делит массив на два подмассива, сортирует их и затем сливает их обратно в один отсортированный массив. Это деление продолжается до тех пор, пока каждый подмассив не станет содержать только один элемент, после чего начинается процесс слияния.

Функция сортировкаСлиянием(массив):
    если длина(массив) > 1 то:
        середина ← длина(массив) // 2
        леваяПоловина ← массив[0:середина]
        праваяПоловина ← массив[середина:конец]

        сортировкаСлиянием(леваяПоловина)
        сортировкаСлиянием(праваяПоловина)

        i ← 0  # Индекс для левой половины
        j ← 0  # Индекс для правой половины
        k ← 0  # Индекс для исходного массива

        пока i < длина(леваяПоловина) и j < длина(праваяПоловина):
            если леваяПоловина[i] < праваяПоловина[j] то:
                массив[k] ← леваяПоловина[i]
                i ← i + 1
            иначе:
                массив[k] ← праваяПоловина[j]
                j ← j + 1
            конец если
            k ← k + 1

        пока i < длина(леваяПоловина):
            массив[k] ← леваяПоловина[i]
            i ← i + 1
            k ← k + 1

        пока j < длина(праваяПоловина):
            массив[k] ← праваяПоловина[j]
            j ← j + 1
            к ← к + 1
    конец если
конец функции

Сортировка вставками#

Сортировка вставками — это один из простейших алгоритмов сортировки, который работает по принципу пошагового построения отсортированной части массива, где каждый новый элемент вставляется в нужное место в уже отсортированной части. Этот алгоритм эффективно работает на малых объемах данных, но его производительность значительно ухудшается на больших объемах.

Идея работы алгоритма:

  • Начинаем с второго элемента массива и сравниваем его с предыдущим.
  • Если текущий элемент меньше предыдущего, перемещаем его на нужную позицию в отсортированную часть массива, сдвигая остальные элементы вправо.
  • Повторяем эти шаги для всех элементов массива, постепенно расширяя отсортированную часть.
Функция сортировкаВставками(массив):
    для i от 1 до длина(массив) - 1:
        текущий ← массив[i]
        j ← i - 1
        пока j >= 0 и массив[j] > текущий:
            массив[j + 1] ← массив[j]
            j ← j - 1
        конец пока
        массив[j + 1] ← текущий
    конец цикла
конец функции

Сортировка Шелла#

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

Идея заключается в том, чтобы сначала отсортировать элементы с большими интервалами, а затем постепенно уменьшать шаг, пока не достигнем единичного шага, что приведет к окончательной сортировке.

Функция сортировкаШелла(массив):
    n ← длина(массив)
    шаг ← n // 2  # Начальный шаг

    пока шаг > 0:
        для i от шаг до n - 1:
            временный ← массив[i]
            j ← i
            пока j >= шаг и массив[j - шаг] > временный:
                массив[j] ← массив[j - шаг]
                j ← j - шаг
            конец пока
            массив[j] ← временный
        конец цикла
        шаг ← шаг // 2  # Уменьшаем шаг
    конец цикла
конец функции

Поразрядная сортировка#

Поразрядная сортировка (Radix Sort) — это алгоритм сортировки, который работает путем обработки элементов по разрядам (цифрам, буквам и т. д.), начиная с наименее значимого разряда (или наоборот — с наиболее значимого).

Основные этапы алгоритма:

  • Алгоритм обрабатывает числа или строки по разрядам.
  • Сортирует элементы на каждом разряде с использованием другого алгоритма сортировки (чаще всего сортировки подсчетом).
  • Повторяет процесс для каждого разряда, начиная с младшего и заканчивая старшим.
  • После завершения сортировки элементов по всем разрядам массив становится отсортированным.
Функция поразряднаяСортировка(массив):
    максимальноеЧисло ← максимальное(массив)
    разряд ← 1
    пока максимальноеЧисло // разряд > 0:
        сортироватьПоРазряду(массив, разряд)
        разряд ← разряд * 10
    конец цикла
конец функции

Функция сортироватьПоРазряду(массив, разряд):
    # Используем сортировку по подсчету для данного разряда
    корзины ← [пустой список для 10 разрядов]
    для числа в массиве:
        индексКорзины ← (число // разряд) % 10
        корзины[индексКорзины].добавить(число)
    конец цикла
    массив ← объединитьКорзины(корзины)
конец функции

Функция объединитьКорзины(корзины):
    объединенныйМассив ← пустой список
    для корзины в корзинах:
        объединенныйМассив.расширить(корзина)
    конец цикла
    вернуть объединенныйМассив

Быстрая сортировка#

Быстрая сортировка (Quick Sort) — это один из самых быстрых алгоритмов сортировки. Она также использует метод "разделяй и властвуй", но отличается от сортировки слиянием тем, что данные не нужно копировать в дополнительные массивы. Алгоритм основывается на выборе опорного элемента, который затем используется для разделения массива на две части — элементы меньшие опорного и элементы большие опорного. После этого рекурсивно сортируются эти части.

Основные этапы алгоритма:

  1. Выбирается опорный элемент.
  2. Массив переставляется так, чтобы все элементы, меньшие опорного, оказались слева от него, а все элементы, большие — справа.
  3. Рекурсивно повторяем сортировку для левой и правой части массива.
Функция быстраяСортировка(массив, низ, высокий):
    если низ < высокий то:
        опорныйИндекс ← разделить(массив, низ, высокий)
        быстраяСортировка(массив, низ, опорныйИндекс - 1)
        быстраяСортировка(массив, опорныйИндекс + 1, высокий)
    конец если

Функция разделить(массив, низ, высокий):
    опорный ← массив[высокий]
    i ← низ - 1
    для j от низ до высокий - 1:
        если массив[j] <= опорный то:
            i ← i + 1
            поменять местами(массив[i], массив[j])
    поменять местами(массив[i + 1], массив[высокий])
    вернуть i + 1

Варианты#

Алгоритм 1 Алгоритм 2 Алгоритм 3
1 Поразрядная сортировка Гномья сортировка Быстрая сортировка
2 Сортировка пузырьком Поразрядная сортировка Быстрая сортировка
3 Поразрядная сортировка Сортировка слиянием Быстрая сортировка
4 Поразрядная сортировка Сортировка расческой Быстрая сортировка
5 Сортировка Шелла Поразрядная сортировка Быстрая сортировка
6 Сортировка вставками Поразрядная сортировка Быстрая сортировка
7 Поразрядная сортировка Сортировка пузырьком Быстрая сортировка
8 Сортировка слиянием Поразрядная сортировка Быстрая сортировка
9 Поразрядная сортировка Сортировка Шелла Быстрая сортировка
10 Гномья сортировка Поразрядная сортировка Быстрая сортировка
11 Сортировка пузырьком Сортировка слиянием Быстрая сортировка
12 Сортировка расческой Сортировка Шелла Быстрая сортировка
13 Сортировка вставками Сортировка пузырьком Быстрая сортировка
14 Сортировка слиянием Сортировка расческой Быстрая сортировка
15 Сортировка Шелла Сортировка вставками Быстрая сортировка
16 Поразрядная сортировка Поразрядная сортировка Быстрая сортировка
17 Поразрядная сортировка Сортировка пузырьком Быстрая сортировка
18 Сортировка слиянием Поразрядная сортировка Быстрая сортировка
19 Поразрядная сортировка Сортировка Шелла Быстрая сортировка
20 Сортировка вставками Поразрядная сортировка Быстрая сортировка
21 Поразрядная сортировка Гномья сортировка Быстрая сортировка
22 Поразрядная сортировка Сортировка пузырьком Быстрая сортировка
23 Сортировка слиянием Поразрядная сортировка Быстрая сортировка
24 Поразрядная сортировка Сортировка расческой Быстрая сортировка
25 Сортировка Шелла Поразрядная сортировка Быстрая сортировка
26 Поразрядная сортировка Сортировка вставками Быстрая сортировка
27 Поразрядная сортировка Сортировка слиянием Быстрая сортировка
28 Сортировка пузырьком Поразрядная сортировка Быстрая сортировка
29 Поразрядная сортировка Сортировка Шелла Быстрая сортировка
30 Гномья сортировка Поразрядная сортировка Быстрая сортировка