Вы находитесь на странице: 1из 23

Занятие #0.

   Квадратичные сортировки.

Алгоритмы и структуры данных


Занятие #0.   Квадратичные сортировки.

Полугодовой курс, посвященный наиболее


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

Занятия делятся на три основных раздела.

● Сортировка и поиск.
● Структуры данных.

● Теория графов и алгоритмы поиска путей.


Занятие #0.   Квадратичные сортировки.

Домашние задания — в тестирующей системе EduApp


после каждого занятия. За задания решенные не в
срок — половина баллов.

Краткие самостоятельные работы (3 шт.) — после


прохождения каждого раздела.
Занятие #0.   Квадратичные сортировки.

Курс создан преподавателями олимпиадного


отделения Школы программистов.

Корябкин Иван Александрович Хисматуллин Тимур Радикович


koryabkin@informatics.ru khismatullin@informatics.ru
Занятие #0.   Квадратичные сортировки.

Многие алгоритмы, работающие в крупных


промышленных приложениях, эффективнее работают
с упорядоченными данными.

Одним из наиболее распространенных методов


организации данных является их сортировка.
Занятие #0.   Квадратичные сортировки.

Словари Номера домов

Банковские ячейки
Занятие #0.   Квадратичные сортировки.

В курсе будут рассмотрено несколько различных


алгоритмов сортировки в порядке их усложнения.

Первым алгоритмом является алгоритм сортировки


пузырьком (Bubble Sort).
Занятие #0.   Квадратичные сортировки.

Рассмотрим пример массива.

7 5 3 -1 11 8 1 5

Будем сортировать его по неубыванию элементов, т.е.


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

Тогда результат должен выглядеть так:

-1 1 3 5 5 7 8 11
Занятие #0.   Квадратичные сортировки.

7 5 3 -1 11 8 1 5

Назовем инверсией такую пару элементов массива,


что в массиве отсортированном они бы находились
относительно друг друга в другом порядке.

Например, элементы 11 и 1 образуют инверсию, так


как число 11 явно должно находиться правее 1 в
отсортированном массиве.

Очевидно, что если в массиве нет инверсий, то он


отсортирован.
Занятие #0.   Квадратичные сортировки.

7 5 3 -1 11 8 1 5

В рамках алгоритма сортировки пузырьком мы будем


проходиться по массиву слева направо, рассматривая
пары подряд идущих элементов. Если они будут
образовывать инверсию, мы будем менять их местами.
Занятие #0.   Квадратичные сортировки.

1 7 5 3 -1 11 8 1 5
2 5 7 3 -1 11 8 1 5
3
5 3 7 -1 11 8 1 5
4 5 3 -1 7 11 8 1 5
5 5 3 -1 7 11 8 1 5
Занятие #0.   Квадратичные сортировки.

6 5 3 -1 7 8 11 1 5

7 5 3 -1 7 8 1 11 5

5 3 -1 7 8 1 5 11

Исчезли ли из массива все инверсии?


Занятие #0.   Квадратичные сортировки.

5 3 -1 7 8 1 5 11

Можно заметить, что максимальный элемент в


массиве занял место в самом его конце.

Данная особенность прохода по массиву называется


«всплытием элементов». В честь этой особенности
сортировка и названа сортировкой пузырьком.

Что будет после ещё одного прохода по массиву?


Постройте в тетради.
Занятие #0.   Квадратичные сортировки.

3 -1 5 7 1 5 8 11

Свое место займет второй по величине элемент.

Сколько нужно проходов по массиву, чтобы все


элементы заведомо заняли свои места в общем случае?
Занятие #0.   Квадратичные сортировки.

-1 1 3 5 5 7 8 11

Ответ: N — 1, где N — количество элементов в массиве.

Напишем реализацию данного алгоритма на языке


C++.
Занятие #0.   Квадратичные сортировки.

int a[N];
for (int i = 1; i < n; ++i)
for (int j = 1; j < n; ++j)
if (a[j-1] > a[j])
swap(a[j-1], a[j]);

Как можно оптимизировать этот код?


Занятие #0.   Квадратичные сортировки.

int a[N];
for (int i = 1; i < n; ++i)
for (int j = 1; j <= n-i; ++j)
if (a[j-1] > a[j])
swap(a[j-1], a[j]);
Занятие #0.   Квадратичные сортировки.

Чуть более сложной в реализации, но, возможно,


идейно чуть более простой является сортировка
выбором.

В данном алгоритме сначала ищется минимальный


элемент, после чего он устанавливается на первое
место, затем минимум среди оставшихся и
устанавливается на второе место, и так далее...
Занятие #0.   Квадратичные сортировки.

7 5 3 -1 11 8 1 5

Ищем минимум, ставим на первое место.


Занятие #0.   Квадратичные сортировки.

-1 5 3 7 11 8 1 5

Ищем минимум, среди оставшихся чисел, ставим на


второе место.
Занятие #0.   Квадратичные сортировки.

-1 1 3 7 11 8 5 5

Аналогичным образом ищем третий, четвертый,


пятый и дальнейшие элементы.

Напишем реализацию данного алгоритма на языке


C++.
Занятие #0.   Квадратичные сортировки.

int a[N];
for (int i = 0; i < n-1; ++i) {
int min = i;
for (int j = i+1; j < n; ++j)
if (a[min] > a[j])
min = j;
swap(a[min], a[i]);
}
Занятие #0.   Квадратичные сортировки.

Задание

1. Реализуйте на компьютерах обе сортировки.

2. Добавьте в их реализацию счетчики, которые


подсчитывают количество сравнений и количество
обменов (swap).

3. Сравните количество операций на разных массивах.