Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс осень 2021 – 5.3 занятие

ТиМПИ
October 08, 2021

Программирование – 1 курс осень 2021 – 5.3 занятие

ТиМПИ

October 08, 2021
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 2/24 2/24 Постановка задачи 1/2 • Исходные данные – последовательность

    чисел 𝑎1 , 𝑎2 , … 𝑎𝑛 . Результат – последовательность 𝑎1 ′ , 𝑎2 ′ , … 𝑎𝑛 ′ , состоящая из тех же чисел, идущих в неубывающем порядке.
  2. 3/24 3/24 Постановка задачи 2/2 • Сортировать числа 1, 2,

    3, 15, 20, 34… • Сортировать строки A, AA, AB, ABC, … • Сортировать типы данных (по выделяемой памяти) char, short, int, double, …
  3. 4/24 4/24 Свойства сортировок • Есть понятие «ключ». • Устойчивость

    — сохраняется ли взаимное расположение элементов с одинаковым ключом • Естественность — эффективность метода при обработке уже упорядоченных или частично упорядоченных данных. Алгоритм ведёт себя естественно, если учитывает эту характеристику входной последовательности и работает лучше. • Внутренняя сортировка — работает над данными, целиком помещающимися в память • Внешняя сортировка работает над данными на устройствах с последовательным доступом, которые медленнее, чем память • Сложность
  4. 5/24 5/24 Сортировка пузырьком 1/2 Идея метода: шаг сортировки состоит

    в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами. Варианты остановки алгоритма: после N-1 проходов; если за проход не было сделано ни одной перестановки function bubbleSort(a): for i = 0 to n - 2 for j = 0 to n - 2 if a[j] > a[j + 1] swap(a[j], a[j + 1]) Первый проход: (5 1 4 2 8) (1 5 4 2 8), (1 5 4 2 8) (1 4 5 2 8), (1 4 5 2 8) (1 4 2 5 8), (1 4 2 5 8) (1 4 2 5 8), Второй проход: (1 4 2 5 8) (1 4 2 5 8), (1 4 2 5 8) (1 2 4 5 8), (1 2 4 5 8) (1 2 4 5 8), Третий проход: (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8)
  5. 6/24 6/24 Сортировка пузырьком 2/2 • Лучший случай – •

    Худший случай – • Оценка памяти – • Устойчивость – • Естественность – Особенности: мало кода, быстро реализуется 𝒏 𝒏𝟐 Да 1 Да
  6. 7/24 7/24 Сортировка вставками 1/2 Общая суть сортировок вставками такова:

    1. Перебираются элементы в неотсортированной части массива. 2. Каждый элемент вставляется в отсортированную часть массива на то место, где он должен находиться.
  7. 8/24 8/24 Сортировка вставками 2/2 • Особенности: лучшее решение для

    почти упорядоченных массивов • Лучший случай • Худший случай • Оценка памяти • Устойчивость • Естественность Процедура InsertionSort(A: массив, min - начальный индекс, max - конечный индекс); Начало Цикл для i от min+1 до max j=i tmp=Ai ; //запоминаем значение ещё неотсортированного элемента цикл пока (j>min и Aj-1 >tmp): //Сравниваем очередной отсортированный элемент, если он больше, 1. Aj =Aj-1 //то сдвигаем его в большую сторону, освобождая место для вставки 2. j=j-1 //Переходим к следующему элементу в отсортированной части массива Aj =tmp; //Место для нового элемента определено - вставляем его туда Конец процедуры 𝒏 𝒏𝟐 Да 1 Да
  8. 9/24 9/24 Сортировка Шелла Основана на сравнении элементов массива, расположенных

    на определенном расстоянии друг от друга, которое постепенно уменьшается до 1.
  9. 10/24 10/24 Сортировка Шелла: выбор шага Теоретикам не удалось найти

    оптимальную схему выбора шагов. Дональд Кнут провел множество экспериментов и нашел следующую формулу выбора шагов h для массива длины N: в последовательности ℎ1 = 1, ℎ𝑠+1 + 1 = 3ℎ𝑠 + 1, ... взять ℎ𝑡, если ℎ𝑡+2 ≥ 𝑁. Вот несколько первых значений h: h 1 = 1 h 2 = (3 x 1) + 1 = 4 h 3 = (3 x 4) + 1 = 13 h 4 = (3 x 13) + 1 = 40 h 5 = (3 x 40) + 1 = 121
  10. 11/24 11/24 Сортировка Шелла • Лучший случай 𝒏 log2 𝒏

    • Худший случай 𝒏𝟑/𝟐 • Оценка памяти 1 • Устойчивость Нет • Естественность Особенности: мало кода, довольно быстра, не вырождается до квадратичной. Шаг 0. 𝑖 = 𝑡 Шаг 1. Разобьем массив на списки элементов, отстающих друг от друга на ℎ𝑖 . Таких списков будет ℎ𝑖 . Шаг 2. Отсортируем элементы каждого списка сортировкой вставками. Шаг 3. Объединим списки обратно в массив. Уменьшим 𝑖. Если 𝑖 неотрицательно — вернемся к шагу 1 Конец.
  11. 12/24 12/24 Быстрая сортировка 1/2 Метод основан на подходе «разделяй-и-властвуй».

    Общая схема такова: 1. из массива выбирается некоторый опорный элемент a[i] (идеально – медиана, но её вычисление слишком трудоёмко для сортировки). 2. запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] – вправо. 3. теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого 4. для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру. В конце получится полностью отсортированная последовательность.
  12. 13/24 13/24 Быстрая сортировка 2/2 • Лучший случай 𝒏 log

    𝒏 • Средний случай 𝒏 log 𝒏 • Худший случай 𝒏𝟐 • Оценка памяти log 𝒏 • Устойчивость Нет • Естественность Нет Быстрая сортировка является наиболее широко применяемым и одним их самых эффективных алгоритмов, обычно лежит в основе библиотечных реализаций сортировок.
  13. 14/24 14/24 Сортировка слиянием 1/2 Алгоритм использует принцип «разделяй и

    властвуй»: задача разбивается на подзадачи меньшего размера, которые решаются по отдельности, после чего их решения комбинируются для получения решения исходной задачи. 1. Если в рассматриваемом массиве один элемент, то он уже отсортирован — алгоритм завершает работу. 2. Иначе массив разбивается на две части, которые сортируются рекурсивно. 3. После сортировки двух частей массива к ним применяется процедура слияния, которая по двум отсортированным частям получает исходный отсортированный
  14. 15/24 15/24 Сортировка слиянием 2/2 • Лучший случай 𝒏 log

    𝒏 • Средний случай 𝒏 log 𝒏 • Худший случай 𝒏 log 𝒏 • Оценка памяти 𝒏 • Стабильность Нет Особенности: • можно написать эффективную многопоточную сортировку слиянием; • сортировка данных, расположенных на периферийных устройствах и не вмещающихся в оперативную память.
  15. 17/24 17/24 Как выбрать алгоритм сортировки Критерий Алгоритм Маленький массив

    Сортировка вставками Почти упорядоченный массив Сортировка вставками Важна работа в среднем Быстрая сортировка Нужно мало кода Сортировка вставками