Алгоритмы и анализ сложности. Эффективные алгоритмы сортировки

Содержание

Слайд 2

Задача сортировки элементов массива

 

Задача сортировки элементов массива

Слайд 3

Рекуррентное слияние (снизу вверх)

 

Рекуррентное слияние (снизу вверх)

Слайд 4

Рекуррентное слияние (снизу вверх)

 

Рекуррентное слияние (снизу вверх)

Слайд 5

Рекуррентный алгоритм слияния

void merge_sort(double *A, int n)
{
int s, b, c, e;

Рекуррентный алгоритм слияния void merge_sort(double *A, int n) { int s, b,
double *D = new double[n];
for (s = 1; s < n; s *= 2) {
for (b = 0; b < n; b += s*2) {
c = min(b+s-1, n-1);
e = min(c+s, n-1);
merge_series(A, b, c, e, D);
}
for (b = 0; b < n; b++) A[b] = D[b];
}
delete [] D;
}

Слайд 6

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

 

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

Слайд 7

Сортировка Шелла: h-цепочки

 

Сортировка Шелла: h-цепочки

Слайд 8

Сортировка вставкам с шагом h

 

Сортировка вставкам с шагом h

Слайд 9

Сортировка Шелла: идея и требования

 

Сортировка Шелла: идея и требования

Слайд 10

Сортировка Шелла: выбор шага h

 

Сортировка Шелла: выбор шага h

Слайд 11

Сортировка Шелла: алгоритм

 

Сортировка Шелла: алгоритм

Слайд 12

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

 

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

Слайд 13

Свойства пирамиды (бинарной кучи)

 

Свойства пирамиды (бинарной кучи)

Слайд 14

Идея сортировки

 

Идея сортировки

Слайд 15

Построение пирамиды

 

Построение пирамиды

Слайд 16

Трудоемкость построения пирамиды

 

Трудоемкость построения пирамиды

Слайд 17

Трудоемкость построения пирамиды

 

Трудоемкость построения пирамиды

Слайд 18

Функция просеивания в пирамиде

Параметры и переменные функции sift:
i – начальный

Функция просеивания в пирамиде Параметры и переменные функции sift: i – начальный
номер просеиваемого элемента,
m – номер конечного элемента в текущей пирамиде,
j – текущий номер просеиваемого элемента,
k – номер левого или большего сына j.
void sift(double *A, int i, int m)
{
int j = i, k = i*2+1; // левый сын
while (k <= m)
{
if (k if (A[j] < A[k])
{ swap(A[j], A[k]); j = k; k = k*2+1; }
else break;
}
}

Слайд 19

Алгоритм пирамидальной сортировки

void heap_sort(double *A, int n)
{
int i, m;
//

Алгоритм пирамидальной сортировки void heap_sort(double *A, int n) { int i, m;
построение пирамиды
for (i = n/2; i >= 0; i--)
sift(A, i, n-1);
// сортировка массива
for (m = n-1; m >= 1; m--)
{
swap(A[0], A[m]);
sift(A, 0, m-1);
}
}

Слайд 20

Быстрая сортировка (Хоар)

 

Быстрая сортировка (Хоар)

Слайд 21

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

 

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

Слайд 22

Быстрая сортировка: трудоемкость в среднем

 

Быстрая сортировка: трудоемкость в среднем

Слайд 23

Трудоемкость в среднем: доказательство

 

Трудоемкость в среднем: доказательство

Слайд 24

Трудоемкость в среднем: доказательство

 

Трудоемкость в среднем: доказательство

Слайд 25

Трудоемкость в среднем: доказательство

Таким образом:

Трудоемкость в среднем: доказательство Таким образом:

Слайд 26

Разделение массива: 1-й способ

 

Разделение массива: 1-й способ

Слайд 27

Разделение массива: 2-й способ

 

Разделение массива: 2-й способ

Слайд 28

Быстрая сортировка с 2 рекурсивными вызовами

void quick_sort_2(double *A, int b, int e)
{

Быстрая сортировка с 2 рекурсивными вызовами void quick_sort_2(double *A, int b, int
double x; int i, j;
x = A[(b+e)/2]; i = b; j = e;
while (i < j)
{
while (A[i] < x) i++;
while (A[j] > x) j--;
if (i <= j) {
{ swap(A[i], A[j]); i++; j--; }
}
if (b < j) quick_sort_2(A, b, j);
if (i < e) quick_sort_2(A, i, e);
}

Слайд 29

Быстрая сортировка с 1 рекурсивным вызовом

 

Быстрая сортировка с 1 рекурсивным вызовом

Слайд 30

Быстрая сортировка с 1 рекурсивным вызовом

 

Быстрая сортировка с 1 рекурсивным вызовом

Слайд 31

Быстрая сортировка с 1 рекурсивным вызовом

void quick_sort(double *A, int b, int e)
{

Быстрая сортировка с 1 рекурсивным вызовом void quick_sort(double *A, int b, int
double x; int i, j, c = b, d = e;
while (c < d) {
x = A[(c+d)/2]; i = c; j = d;
while (i < j) {
while (A[i] < x) i++;
while (A[j] > x) j--;
if (i <= j)
{ swap(A[i], A[j]); i++; j--; }
}
if (j-c < d-i)
{ if (c < j) quick_sort(A,c,j); c = i; }
else { if (i }
}

Слайд 32

Свойства алгоритмов сортировки

 

Свойства алгоритмов сортировки

Слайд 33

Поиск k-го минимального элемента

 

Поиск k-го минимального элемента

Слайд 34

Поиск k-го минимального элемента

 

Поиск k-го минимального элемента