SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
Алгоритмы и
структуры данных

Сортировки
Алгоритмы сортировки

 Сортировка – процесс упорядочивания элементов массива
 Многие программы используют алгоритмы сортировки.
Часто время их работы определяется временем сортировки
 Данные часто упорядочены каким либо
 Многие задачи существенно быстрее решаются на
предварительно упорядоченных данных

2
1. Простые сортировки
2. Предел скорости
3. Ускорение
4. Хорошие сортировки
5. Особые свойства
6. Поразрядная сортировка
7. Сравнение
3
Сортировка 1 и 2х элементов
void sort_1(int *a) {
return;
}
void sort_2(int *a) {
if (a[1] < a[0]) {
swap(a[1], a[0]);
}
}

4
Сортировка 3х элементов
void sort_3(int *a) {
if (a[1] < a[0]) {
if (a[2] < a[1]) {
// 2 1 0
} else {
if (a[2] < a[0])
// 1 2 0
} else {
// 1 0 2
}
}
} else {
if (a[2] < a[0]) {
// 2 0 1
} else {
if (a[2] < a[1])
// 0 2 1
} else {
// 0 1 2
}
}
}
}

{

{

5
Избыточное сравнение

6
Прострые сортировки
 Существует множество алгоритмов сортировка
 Сортировка выбором - Selection Sort
 Сортировка вставками - Insertion Sort
 Пузырьковая сортировка - Bubble Sort

7
Сортировка выбором
 Разделим массив на две части: левую - упорядоченную и правую –
неупорядоченную
 Будем гарантировать, что элементы в правой части больше чем в левой

 Выберем наименьший элемент в правой части и переставим его в её начало
 После каждого выбора и перестановки, будем смещать границу между
частями массива на 1 вправо
 Выбор каждого нового элемента требует прохода по правой части
 Для сортировки массива из N элементов требуется N-1 проход

8
Сортировка выбором

78

45

8

32

56

8

78

45

23

32

56

2

8

23

45

78

32

56

3

8

23

32

78

45

56

4

8

23

32

45

78

56

5

8

23

32

45

56

78

Unordered

23

1

Ordered

0

9
Сортировка выбором
void selection_sort(int *a, int n) {
for (int i = 0; i < n - 1; ++i) {
int min_index = i;
for (int j = i + 1; j < n; ++j) {
if (a[j] < a[min_index]) min_index = j;
}
swap(a[i], a[min_index]);
}
}
void swap(int &a, int &b ) {
int tmp = a;
a = b;
b = tmp;
}

10
Сортировка выбором: Анализ
 В общем случае алгоритм сортировки состоит из сравнения
ключей и перестановки элементов
 Время работы алгоритма пропорционально количеству
сравнений и количеству перестановок
 Внешний цикл совершает n-1 итерацию

 В каждой итерации 1 перестановка
 В 1й итерации n-1 сравнение, во 2й – n-2, … в n-1й – 1
 Ровно 𝒏(𝒏 − 𝟏)/𝟐 сравнений
 Ровно 𝒏 − 𝟏 перемещений

11
Сортировка выбором: Анализ
 Количество операций не зависит от состава массива
 Сложность в лучшем и в худшем случае совпадает: 𝑶(𝒏 𝟐 )

12
Сортировка вставками
 Сортировка вставками – простой алгоритм часто применяемый
на малых объёмах данных
 Самый популярный метод сортировки у игроков в покер

 Массив делится на две части, упорядоченную - левую и
неупорядоченную - правую
 На каждой итерации выбираем элемент из правой части и
вставляем его на подходящее место в левой части
 Массив из n элементов требует n-1 итерацию

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

45

8

32

56

78

45

8

32

56

23

45

78

8

32

56

8

23

45

78

32

56

8

23

32

45

78

56

8

23

32

45

56

78

Unordered

78

23

Ordered

23

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

void insertion_sort(int *a, int n) {
for (int i = 1; i < n; ++i) {
int tmp = a[i];
for (int j = i; j > 0 && tmp < a[j-1]; --j) {
a[j] = a[j-1];
}
a[j] = tmp;
}
}

15
Сортировка вставками: Анализ
 Время работы алгоритма зависит не только от размера
массива, но и от порядка элементов

 O(n)

 Лучший случай:


Массив упорядочен по возрастанию



Внутренний цикл сделает 0 итераций



Количество копирований: 2*(n-1)

 O(n)



Количество сравнений: (n-1)

 O(n)

 Худший случай:

 O(n2)



Массив упорядочен в порядке убывания:



Внутренний цикл работает i-1 итерацию, для i = 2,3, …, n



Количество копирований: 2*(n-1)+(1+2+...+n-1)= 2*(n-1)+ n*(n-1)/2  O(n2)



Количество сравнений: (1+2+...+n-1)= n*(n-1)/2

 В среднем:

 O(n2)

 O(n2)
16
Сортировка пузырьком
 Сортировка пузырьком – частный случай сортировки выбором
 Массив делится на две части, упорядоченную - левую и
неупорядоченную - правую
 На каждой итерации проходим правую часть сравнивая
текущий элемент с соседом слева
 меняем элементы местами если сосед больше

 Иначе, уменьшаем индекс текущего на 1

 Наименьший элемент всплывает к границе левой части
 Останавливаемся если не было ни одного обмена
 Массив из n элементов требует максимум n-1 итерацию

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

18
Сортировка пузырьком: Анализ
 Лучший случай
 1 проход, N-1 сравнение, 0 обменов => 𝑶(𝑵)

 Худший случай
 N-1 проход, N(N-1)/2 сравнений, N-1 обменов => 𝑶(𝑵 𝟐 )

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

20
Предел скорости
 Оценка сложности

21
Теоретико-числовая оценка сложности
 Количество перестановок N элементов: N!
 1 сравнение = 1 бит информации

 Для записи номера перестановки нужно
𝑙𝑜𝑔2 𝑁! ≅ 𝑁 𝑙𝑜𝑔 𝑁 бит

22
Сортировка вставками. n(log(n)) ?
 Будем искать позицию вставки в упорядоченную
часть массива бинарным поиском
 𝑶 𝒏 𝐥𝐨𝐠 𝒏 - операций сравнения
 𝑶(𝒏 𝟐 ) – операций перемещения
 Используем memmove для уменьшения константы
𝑪𝟐
 𝑻 𝒏 ≤ 𝑪 𝟏 𝒏 𝒍𝒐𝒈(𝒏) + 𝑪 𝟐 𝒏^𝟐

23
Сортировка вставками. n(log(n)) ?

void memmove(char *dst, char *src, int size);
void insertionSortFast(int *a, int n) {
for (int i = 1; i < n; ++i) {
int new_pos = binary_search(a, i, a[i]);
if (new_pos < i) {
int tmp = a[i];
memmove(&a[new_pos + 1], &a[new_pos],
(i - new_pos)*sizeof(int));
a[new_pos] = tmp;
}
}
}

24
Сортировка вставками. n(log(n)) ?
 Будем искать позицию вставки за время 𝑶(𝒍𝒐𝒈(𝒊 − 𝒌))
 𝑶 𝒏 𝐥𝐨𝐠 𝒏 , 𝜽(𝒏) - операций сравнения


𝑶 𝒏 𝟐 , 𝜽 𝟏 - операций перемещения

25
Хорошие сортировки

 Пирамидальная сортировка - Heap Sort
 Сортировка слиянием - Merge Sort
 Быстрая сортировка - Quick Sort

26
Пирамидальная сортировка

 N вставок в кучу: N • O(log(N))
 N Извлечение минимума из кучи: N • O(log(n))
 Построение кучи из N элементов: O(2N•log(N))

27
Пирамидальная сортировка .

void heap_insert(int *a, int n, int x)
{
a[n+1] = x;
for (int i = n+1; i > 1;) {
if (a[i] > a[i/2]) {
swap(a[i], a[i/2]);
i = i/2;
} else {
break;
}
}
}

28
Пирамидальная сортировка ..

void heap_pop(int *a, int n) {
swap(a[n],a[1]);
for (int i = 1; 2*i < n;) {
i *= 2;
if (i+1 < n && a[i] < a[i+1]) {
i += 1;
}
if (a[i/2] < a[i]) {
swap(a[i/2], a[i]);
}
}
}

29
Пирамидальная сортировка ..!

void heap_sort(int *data, int n) {
int *buff = new int[n+1];
for (int i = 0; i < n; ++i) {
heap_insert(buff, i, data[i]);
}
for (int i = 0; i < n; ++i) {
data[n-1-i] = buff[1];
heap_pop(buff, n - i);
}
delete [] buff;
}

30
Пирамидальная сортировка

 Построить пирамиду за линейное время: O(N)
 N раз достать максимальный элемент: O(N•log(N))
 Не использовать дополнительную память

31
Пирамида за линейное время

 Для каждого внутреннего элемента
восстановить порядок
 По 2 сравнения на уровень дерева
 N/2 • 2

32
Пирамида за линейное время

33
Пирамида за линейное время

void heap_make(int *a, int n) {
for (int i = n/2; i >= 1; --i) {
for (int j = i; j <= n/2;) {
int k = j*2;
if (k+1 <= n and a[k] < a[k+1]) {
++k;
}
if (a[j] < a[k]) {
swap(a[k],a[j]);
j = k;
} else {
break;
}
}
}
}

34
Пирамида за линейное время

void heap_sort_fast(int *data, int n)
{
heap_make(data - 1, n);
for (int i = 0; i < n; ++i) {
heap_pop(data - 1, n - i);
}
}

35
Пирамидальная сортировка
как эволюция сортировки выбором

Heap

Sorted

36
Сортировка Хоара: QuickSort
 Разделим массив на 2 части, так что элементы в левой меньше
чем в правой
 Применим эту процедуру к левой и правой частям рекурсивно

37
QuickSort: Split

 Установим 2 указателя: i в – начало массива, j – в
конец
 Будем помнить под каким указателем лежит «пивот»
 Если a[j] > a[i], поменяем элементы массива под I, j

 Сместим на 1 указатель, не указывающий на «пивот»
 Продолжим пока i != j

38
QuickSort: Split

39
Сортировка Хоара
void quick_sort(int *a, int n) {
int i = 0;
int j = n - 1;
bool side = 0;
while (i != j) {
if (a[i] > a[j]) {
swap(a[i], a[j]);
side = !side;
}
if (side) {
++i;
} else{
--j;
}
}
if (i > 1) quick_sort(a, i);
if (n > i+1) quick_sort(a + (i+1), n - (i+1));
}

40
Quicksort: анализ
 Предположим, что split делит массив в соотношении 1:1
 𝑻 𝒏 ≤ 𝒄𝟏+ 𝒄𝟐 𝒏+ 𝑻
=

𝒍𝒐𝒈 𝟐 𝒏
𝒌=𝟎 {𝒄 𝟏

𝒏
𝟐

+ 𝑻

𝒏
𝟐

=

𝟐 𝒌 + 𝒄 𝟐 𝒏} = 𝒄 𝟏 𝒏 + 𝒄 𝟐 𝒏 𝒍𝒐𝒈 𝒏

 𝑻 𝒏 = 𝑶 𝒏 𝒍𝒐𝒈 𝒏

41
Quicksort: анализ
 Упорядоченный массив делится в соотношении 1:n-1
 𝑻 𝒏 =с𝟏+ 𝒄𝟐 𝒏+ 𝑻 𝒏− 𝟏 =

𝟏
𝟐

𝒄𝟐 𝒏𝟐+ 𝒄𝟏 𝒏= 𝑶 𝒏𝟐

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

********************

1

2

3

4

5

6

7

8

42
Quicksort: выбор пивота
 1й элемент
 Серединный элемент
 Медиана трёх
 Случайный элемент

 Медиана
 Медиана по трём случайным
 …

43
Quicksort-killer
 Последовательность, приводящая к времени: 𝑻(𝒏) =
𝑶(𝒏 𝟐 )
 [1,2,3,…n]  первый элемент
 Для любого предопределённого порядка выбора
пивота, существует killer-последовательность

 http://www.cs.dartmouth.edu/~doug/mdmspe.pdf
44
Свойства сортировок
 Локальная сортировка сортировка не требует
дополнительной памяти

 Стабильная сортировка сохраняет порядок
следования равных элементов

45
Стабильность сортировки
 Постоянство порядка элементов с неразличимыми ключами
 Сортировка двузначных чисел по старшему разряду

[21,22,23,24,25,19,18,17,16] => [19,18,17,16,21,22,23,24,25]

Algorithm

insertion

select

heap

quick

merge

stable

Yep

Yep

No

Possible

???

 Любую сортировку можно сделать стабильной, за O(n)
дополнительной памяти

46
Локальность сортировки
 Отсутствие необходимости во внешней памяти
 Тривиальные сортировки локальны
 Cкорость – плата за локальность
Algorithm
Inplace
𝑂(log(𝑛))
𝑂(𝑛)

insertion select
𝑂(𝑛2 )

𝑂(𝑛2 )

heap
𝑂(𝑛 log(𝑛))

quick
𝑂(𝑛 log(𝑛))??

merge
𝑂 𝑛 log 𝑛 ??

𝑂(𝑛 log(𝑛))
𝑂(𝑛 log(𝑛))

 http://akira.ruc.dk/~keld/teaching/algoritmedesign_f04
/Artikler/04/Huang88.pdf <= inplace merge
47
Порядковые статистики
 K-й порядковой статистикой называется элемент,
который окажется на k-й позиции после сортировки
массива

48
Рандомизованная медиана
Медиана RandSelect(A[1, N], k); k = N/2
 Случайно выберем элемент из A: A[j]
 Разобьём A на 2 части: меньше/больше A[j]
 Пусть позиция A[j] в разделённом массиве: k

 k<j?
 Найдём: RandSelect(A[1, j], k)
 Иначе: RandSelect(A[j+1, N], k-j)

49
Quicksort: медиана за линейное время
Медиана  SELECT(A[1,N], k); k = N/2
 Разобьём массив на пятёрки
 Отсортируем каждую пятёрку
 Найдём медиану середин пятёрок
 Разобьём массив на 2 группы: меньше/больше
медианы пятёрок
 Пусть индекс медианы в массиве j
 j>k?
 найдём: SECLECT(A[1, j], k)
 иначе: SELECT(A[j+1, N], k-j)
50
Медиана за линейное время

51
Медиана за линейное время: анализ

• Разобьём массив на пятёрки

• Отсортируем каждую пятёрку 𝒄 𝟏 𝑵
• Найдём медиану середин пятёрок 𝑻(𝑵/𝟓)
• Разобьём массив на 2 группы <> медианы медиан: 𝒄 𝟐 𝑵
• найдём: SECLECT(A[1, j], k) => 𝑻(𝒋)
• иначе: SELECT(A[j+1, N], k-j) => 𝑻 𝑵 − 𝒋 ; 𝟎. 𝟑𝑵 ≤ 𝒋 ≤ 𝟎. 𝟕𝑵;
• 𝑻 𝑵 ≤ 𝑻

𝑵
𝟓

+ 𝒄𝑵 + 𝑻 𝟎. 𝟕𝑵 ; =>

𝑻(𝑵) = 𝑶(𝑵);

52
?
?
Вопросы
?
?
Спасибо за внимание!
Иванов Георгий
Поиск.mail.ru

Weitere ähnliche Inhalte

Was ist angesagt?

Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поискFedor Tsarev
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 

Was ist angesagt? (20)

Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
02 сортировка и поиск
02 сортировка и поиск02 сортировка и поиск
02 сортировка и поиск
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 

Andere mochten auch

Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Technopark
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Technopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 

Andere mochten auch (7)

Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6Алгоритмы и структуры данных осень 2013 лекция 6
Алгоритмы и структуры данных осень 2013 лекция 6
 
Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5Алгоритмы и структуры данных осень 2013 лекция 5
Алгоритмы и структуры данных осень 2013 лекция 5
 
Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3Алгоритмы и структуры данных весна 2014 лекция 3
Алгоритмы и структуры данных весна 2014 лекция 3
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 

Ähnlich wie Алгоритмы и структуры данных осень 2013 лекция 3

Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировкиkogoga
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировкиkogoga
 
1332519 (1).pptx
1332519 (1).pptx1332519 (1).pptx
1332519 (1).pptxrdes1
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировкиkogoga
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировкиkogoga
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиsimple_people
 
сортировка
сортировкасортировка
сортировкаaianami
 
сортировка массива
сортировка массивасортировка массива
сортировка массиваlonge7
 
Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Mikhail Kurnosov
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Alexey Paznikov
 

Ähnlich wie Алгоритмы и структуры данных осень 2013 лекция 3 (20)

Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
1332519 (1).pptx
1332519 (1).pptx1332519 (1).pptx
1332519 (1).pptx
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистикиЛекция 2 Сортировки, поиск и порядковые статистики
Лекция 2 Сортировки, поиск и порядковые статистики
 
сортировка
сортировкасортировка
сортировка
 
Sort
SortSort
Sort
 
сортировка массива
сортировка массивасортировка массива
сортировка массива
 
Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)Лекция 1: Амортизационный анализ (Amortized analysis)
Лекция 1: Амортизационный анализ (Amortized analysis)
 
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 1. Амортизационный анализ (Amortized analysis)
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 
Diskretn analiz
Diskretn analizDiskretn analiz
Diskretn analiz
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Рекурсия. Поиск
Рекурсия. ПоискРекурсия. Поиск
Рекурсия. Поиск
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 

Mehr von Technopark

Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 

Mehr von Technopark (20)

Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

Алгоритмы и структуры данных осень 2013 лекция 3

  • 2. Алгоритмы сортировки  Сортировка – процесс упорядочивания элементов массива  Многие программы используют алгоритмы сортировки. Часто время их работы определяется временем сортировки  Данные часто упорядочены каким либо  Многие задачи существенно быстрее решаются на предварительно упорядоченных данных 2
  • 3. 1. Простые сортировки 2. Предел скорости 3. Ускорение 4. Хорошие сортировки 5. Особые свойства 6. Поразрядная сортировка 7. Сравнение 3
  • 4. Сортировка 1 и 2х элементов void sort_1(int *a) { return; } void sort_2(int *a) { if (a[1] < a[0]) { swap(a[1], a[0]); } } 4
  • 5. Сортировка 3х элементов void sort_3(int *a) { if (a[1] < a[0]) { if (a[2] < a[1]) { // 2 1 0 } else { if (a[2] < a[0]) // 1 2 0 } else { // 1 0 2 } } } else { if (a[2] < a[0]) { // 2 0 1 } else { if (a[2] < a[1]) // 0 2 1 } else { // 0 1 2 } } } } { { 5
  • 7. Прострые сортировки  Существует множество алгоритмов сортировка  Сортировка выбором - Selection Sort  Сортировка вставками - Insertion Sort  Пузырьковая сортировка - Bubble Sort 7
  • 8. Сортировка выбором  Разделим массив на две части: левую - упорядоченную и правую – неупорядоченную  Будем гарантировать, что элементы в правой части больше чем в левой  Выберем наименьший элемент в правой части и переставим его в её начало  После каждого выбора и перестановки, будем смещать границу между частями массива на 1 вправо  Выбор каждого нового элемента требует прохода по правой части  Для сортировки массива из N элементов требуется N-1 проход 8
  • 10. Сортировка выбором void selection_sort(int *a, int n) { for (int i = 0; i < n - 1; ++i) { int min_index = i; for (int j = i + 1; j < n; ++j) { if (a[j] < a[min_index]) min_index = j; } swap(a[i], a[min_index]); } } void swap(int &a, int &b ) { int tmp = a; a = b; b = tmp; } 10
  • 11. Сортировка выбором: Анализ  В общем случае алгоритм сортировки состоит из сравнения ключей и перестановки элементов  Время работы алгоритма пропорционально количеству сравнений и количеству перестановок  Внешний цикл совершает n-1 итерацию  В каждой итерации 1 перестановка  В 1й итерации n-1 сравнение, во 2й – n-2, … в n-1й – 1  Ровно 𝒏(𝒏 − 𝟏)/𝟐 сравнений  Ровно 𝒏 − 𝟏 перемещений 11
  • 12. Сортировка выбором: Анализ  Количество операций не зависит от состава массива  Сложность в лучшем и в худшем случае совпадает: 𝑶(𝒏 𝟐 ) 12
  • 13. Сортировка вставками  Сортировка вставками – простой алгоритм часто применяемый на малых объёмах данных  Самый популярный метод сортировки у игроков в покер  Массив делится на две части, упорядоченную - левую и неупорядоченную - правую  На каждой итерации выбираем элемент из правой части и вставляем его на подходящее место в левой части  Массив из n элементов требует n-1 итерацию 13
  • 15. Сортировка вставками void insertion_sort(int *a, int n) { for (int i = 1; i < n; ++i) { int tmp = a[i]; for (int j = i; j > 0 && tmp < a[j-1]; --j) { a[j] = a[j-1]; } a[j] = tmp; } } 15
  • 16. Сортировка вставками: Анализ  Время работы алгоритма зависит не только от размера массива, но и от порядка элементов  O(n)  Лучший случай:  Массив упорядочен по возрастанию  Внутренний цикл сделает 0 итераций  Количество копирований: 2*(n-1)  O(n)  Количество сравнений: (n-1)  O(n)  Худший случай:  O(n2)  Массив упорядочен в порядке убывания:  Внутренний цикл работает i-1 итерацию, для i = 2,3, …, n  Количество копирований: 2*(n-1)+(1+2+...+n-1)= 2*(n-1)+ n*(n-1)/2  O(n2)  Количество сравнений: (1+2+...+n-1)= n*(n-1)/2  В среднем:  O(n2)  O(n2) 16
  • 17. Сортировка пузырьком  Сортировка пузырьком – частный случай сортировки выбором  Массив делится на две части, упорядоченную - левую и неупорядоченную - правую  На каждой итерации проходим правую часть сравнивая текущий элемент с соседом слева  меняем элементы местами если сосед больше  Иначе, уменьшаем индекс текущего на 1  Наименьший элемент всплывает к границе левой части  Останавливаемся если не было ни одного обмена  Массив из n элементов требует максимум n-1 итерацию 17
  • 19. Сортировка пузырьком: Анализ  Лучший случай  1 проход, N-1 сравнение, 0 обменов => 𝑶(𝑵)  Худший случай  N-1 проход, N(N-1)/2 сравнений, N-1 обменов => 𝑶(𝑵 𝟐 ) 19
  • 22. Теоретико-числовая оценка сложности  Количество перестановок N элементов: N!  1 сравнение = 1 бит информации  Для записи номера перестановки нужно 𝑙𝑜𝑔2 𝑁! ≅ 𝑁 𝑙𝑜𝑔 𝑁 бит 22
  • 23. Сортировка вставками. n(log(n)) ?  Будем искать позицию вставки в упорядоченную часть массива бинарным поиском  𝑶 𝒏 𝐥𝐨𝐠 𝒏 - операций сравнения  𝑶(𝒏 𝟐 ) – операций перемещения  Используем memmove для уменьшения константы 𝑪𝟐  𝑻 𝒏 ≤ 𝑪 𝟏 𝒏 𝒍𝒐𝒈(𝒏) + 𝑪 𝟐 𝒏^𝟐 23
  • 24. Сортировка вставками. n(log(n)) ? void memmove(char *dst, char *src, int size); void insertionSortFast(int *a, int n) { for (int i = 1; i < n; ++i) { int new_pos = binary_search(a, i, a[i]); if (new_pos < i) { int tmp = a[i]; memmove(&a[new_pos + 1], &a[new_pos], (i - new_pos)*sizeof(int)); a[new_pos] = tmp; } } } 24
  • 25. Сортировка вставками. n(log(n)) ?  Будем искать позицию вставки за время 𝑶(𝒍𝒐𝒈(𝒊 − 𝒌))  𝑶 𝒏 𝐥𝐨𝐠 𝒏 , 𝜽(𝒏) - операций сравнения  𝑶 𝒏 𝟐 , 𝜽 𝟏 - операций перемещения 25
  • 26. Хорошие сортировки  Пирамидальная сортировка - Heap Sort  Сортировка слиянием - Merge Sort  Быстрая сортировка - Quick Sort 26
  • 27. Пирамидальная сортировка  N вставок в кучу: N • O(log(N))  N Извлечение минимума из кучи: N • O(log(n))  Построение кучи из N элементов: O(2N•log(N)) 27
  • 28. Пирамидальная сортировка . void heap_insert(int *a, int n, int x) { a[n+1] = x; for (int i = n+1; i > 1;) { if (a[i] > a[i/2]) { swap(a[i], a[i/2]); i = i/2; } else { break; } } } 28
  • 29. Пирамидальная сортировка .. void heap_pop(int *a, int n) { swap(a[n],a[1]); for (int i = 1; 2*i < n;) { i *= 2; if (i+1 < n && a[i] < a[i+1]) { i += 1; } if (a[i/2] < a[i]) { swap(a[i/2], a[i]); } } } 29
  • 30. Пирамидальная сортировка ..! void heap_sort(int *data, int n) { int *buff = new int[n+1]; for (int i = 0; i < n; ++i) { heap_insert(buff, i, data[i]); } for (int i = 0; i < n; ++i) { data[n-1-i] = buff[1]; heap_pop(buff, n - i); } delete [] buff; } 30
  • 31. Пирамидальная сортировка  Построить пирамиду за линейное время: O(N)  N раз достать максимальный элемент: O(N•log(N))  Не использовать дополнительную память 31
  • 32. Пирамида за линейное время  Для каждого внутреннего элемента восстановить порядок  По 2 сравнения на уровень дерева  N/2 • 2 32
  • 34. Пирамида за линейное время void heap_make(int *a, int n) { for (int i = n/2; i >= 1; --i) { for (int j = i; j <= n/2;) { int k = j*2; if (k+1 <= n and a[k] < a[k+1]) { ++k; } if (a[j] < a[k]) { swap(a[k],a[j]); j = k; } else { break; } } } } 34
  • 35. Пирамида за линейное время void heap_sort_fast(int *data, int n) { heap_make(data - 1, n); for (int i = 0; i < n; ++i) { heap_pop(data - 1, n - i); } } 35
  • 36. Пирамидальная сортировка как эволюция сортировки выбором Heap Sorted 36
  • 37. Сортировка Хоара: QuickSort  Разделим массив на 2 части, так что элементы в левой меньше чем в правой  Применим эту процедуру к левой и правой частям рекурсивно 37
  • 38. QuickSort: Split  Установим 2 указателя: i в – начало массива, j – в конец  Будем помнить под каким указателем лежит «пивот»  Если a[j] > a[i], поменяем элементы массива под I, j  Сместим на 1 указатель, не указывающий на «пивот»  Продолжим пока i != j 38
  • 40. Сортировка Хоара void quick_sort(int *a, int n) { int i = 0; int j = n - 1; bool side = 0; while (i != j) { if (a[i] > a[j]) { swap(a[i], a[j]); side = !side; } if (side) { ++i; } else{ --j; } } if (i > 1) quick_sort(a, i); if (n > i+1) quick_sort(a + (i+1), n - (i+1)); } 40
  • 41. Quicksort: анализ  Предположим, что split делит массив в соотношении 1:1  𝑻 𝒏 ≤ 𝒄𝟏+ 𝒄𝟐 𝒏+ 𝑻 = 𝒍𝒐𝒈 𝟐 𝒏 𝒌=𝟎 {𝒄 𝟏 𝒏 𝟐 + 𝑻 𝒏 𝟐 = 𝟐 𝒌 + 𝒄 𝟐 𝒏} = 𝒄 𝟏 𝒏 + 𝒄 𝟐 𝒏 𝒍𝒐𝒈 𝒏  𝑻 𝒏 = 𝑶 𝒏 𝒍𝒐𝒈 𝒏 41
  • 42. Quicksort: анализ  Упорядоченный массив делится в соотношении 1:n-1  𝑻 𝒏 =с𝟏+ 𝒄𝟐 𝒏+ 𝑻 𝒏− 𝟏 = 𝟏 𝟐 𝒄𝟐 𝒏𝟐+ 𝒄𝟏 𝒏= 𝑶 𝒏𝟐 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 ******************** 1 2 3 4 5 6 7 8 42
  • 43. Quicksort: выбор пивота  1й элемент  Серединный элемент  Медиана трёх  Случайный элемент  Медиана  Медиана по трём случайным  … 43
  • 44. Quicksort-killer  Последовательность, приводящая к времени: 𝑻(𝒏) = 𝑶(𝒏 𝟐 )  [1,2,3,…n]  первый элемент  Для любого предопределённого порядка выбора пивота, существует killer-последовательность  http://www.cs.dartmouth.edu/~doug/mdmspe.pdf 44
  • 45. Свойства сортировок  Локальная сортировка сортировка не требует дополнительной памяти  Стабильная сортировка сохраняет порядок следования равных элементов 45
  • 46. Стабильность сортировки  Постоянство порядка элементов с неразличимыми ключами  Сортировка двузначных чисел по старшему разряду [21,22,23,24,25,19,18,17,16] => [19,18,17,16,21,22,23,24,25] Algorithm insertion select heap quick merge stable Yep Yep No Possible ???  Любую сортировку можно сделать стабильной, за O(n) дополнительной памяти 46
  • 47. Локальность сортировки  Отсутствие необходимости во внешней памяти  Тривиальные сортировки локальны  Cкорость – плата за локальность Algorithm Inplace 𝑂(log(𝑛)) 𝑂(𝑛) insertion select 𝑂(𝑛2 ) 𝑂(𝑛2 ) heap 𝑂(𝑛 log(𝑛)) quick 𝑂(𝑛 log(𝑛))?? merge 𝑂 𝑛 log 𝑛 ?? 𝑂(𝑛 log(𝑛)) 𝑂(𝑛 log(𝑛))  http://akira.ruc.dk/~keld/teaching/algoritmedesign_f04 /Artikler/04/Huang88.pdf <= inplace merge 47
  • 48. Порядковые статистики  K-й порядковой статистикой называется элемент, который окажется на k-й позиции после сортировки массива 48
  • 49. Рандомизованная медиана Медиана RandSelect(A[1, N], k); k = N/2  Случайно выберем элемент из A: A[j]  Разобьём A на 2 части: меньше/больше A[j]  Пусть позиция A[j] в разделённом массиве: k  k<j?  Найдём: RandSelect(A[1, j], k)  Иначе: RandSelect(A[j+1, N], k-j) 49
  • 50. Quicksort: медиана за линейное время Медиана  SELECT(A[1,N], k); k = N/2  Разобьём массив на пятёрки  Отсортируем каждую пятёрку  Найдём медиану середин пятёрок  Разобьём массив на 2 группы: меньше/больше медианы пятёрок  Пусть индекс медианы в массиве j  j>k?  найдём: SECLECT(A[1, j], k)  иначе: SELECT(A[j+1, N], k-j) 50
  • 52. Медиана за линейное время: анализ • Разобьём массив на пятёрки • Отсортируем каждую пятёрку 𝒄 𝟏 𝑵 • Найдём медиану середин пятёрок 𝑻(𝑵/𝟓) • Разобьём массив на 2 группы <> медианы медиан: 𝒄 𝟐 𝑵 • найдём: SECLECT(A[1, j], k) => 𝑻(𝒋) • иначе: SELECT(A[j+1, N], k-j) => 𝑻 𝑵 − 𝒋 ; 𝟎. 𝟑𝑵 ≤ 𝒋 ≤ 𝟎. 𝟕𝑵; • 𝑻 𝑵 ≤ 𝑻 𝑵 𝟓 + 𝒄𝑵 + 𝑻 𝟎. 𝟕𝑵 ; => 𝑻(𝑵) = 𝑶(𝑵); 52
  • 54. Спасибо за внимание! Иванов Георгий Поиск.mail.ru