2. Обоснование теоретических оценок временной сложности алгоритмов
Неотрицательная
функция
есть
,
если существует такая постоянная
,
что
,
для всех, кроме конечного (возможно
пустого) множества, неотрицательных
значений
.
Алгоритм сортировки с использованием d-кучи
Лемма 1
Утверждение
Высота
d-кучи
с
узлами
удовлетворяет неравенству
.
Доказательство
Минимальное
число узлов на глубине
равно
.
Максимальное
число узлов на глубине
равно
.
Суммируя
левую и правую части как геометрические
прогрессии, получим
.
Логарифмируя,
получим
.
Лемма 2
Утверждение
Операция
погружение в d-куче
имеет временную оценку
,
где
– количество узлов в куче.
Доказательство
Операция
погружения узла проводится до тех пор,
пока есть потомок с меньшим весом. То
есть, максимум при погружении узла
погружение будет проходить
раз (где
– высота кучи). На каждом уровне кучи
максимум будет проводиться
сравнений, так как узел максимум имеет
потомков. Получаем, что временная оценка
операции погружения принадлежит классу
функций
,
или
.
Теорема
Утверждение
Временная
сложность алгоритма сортировки массива
из n-элементов с
использованием d-кучи
принадлежит классу функций
,
где
– количество узлов в куче,
– высота d-кучи.
Доказательство
Рассмотрим поэтапно алгоритм сортировки.
1.Окучивание.
Так как на этом этапе будет произведено
операций погружения, временная оценка
этого этапа сортировки принадлежит
классу функций
.
2.
Изъятие минимума. Так как на этом этапе
будет произведено
операций погружения, временная оценка
этого этапа сортировки принадлежит
классу функций
.
3.
Перестановка элементов массива в
обратном порядке. Временная оценка
этого этапа сортировки принадлежит
классу функций
.
Итоговая
временная оценка сортировки с помощью
d-кучи есть сумма
временных оценок всех ее этапов:
.
В
результате временная оценка сортировки
с помощью 7-кучи принадлежит классу
функций
.
Алгоритм быстрой сортировки
Для
доказательства того, что время работы
составляет
,
мы используем метод подстановки. Пусть
– наибольшее время работы алгоритма
для массива длины
.
Тогда, очевидно,
![]()
(мы рассматриваем все возможные разбиения на первом шаге).
Докажем
что существует
такое, что
для всех
,
меньших некоторого
.
Тогда
.
Квадратный
трехчлен
достигает максимума на отрезке
в его концах (вторая производная по
положительна, поэтому функция выпукла
вниз). Этот максимум равен
.
Отсюда получаем
,
если
константа c выбрана так,
чтобы
.
Выразим отсюда
:
→
→
→
.
Из
этого следует, что
,
следовательно
,
при
.
Из
всего этого получаем, что временная
оценка быстрой сортировки принадлежит
классу функций
(по определению).
3. Описание реализующих алгоритмы программ
Алгоритм сортировки с использованием d-кучи
//погружение
void HEAP :: Down(int i)
{
int key0, c;
key0=key[i];
c=MinChild(i);
while((c!=0)&&(key0>key[c]))
{
key[i]=key[c];
i=c;
c=MinChild(i);
}
key[i]=key0;
}
//образовать очередь
void HEAP :: MakeQueue()
{
int i;
for(i=n-1; i>=0; i--)
{
Down(i);
}
}
//изъятие минимума
void HEAP :: MinOut()
{
int key0;
key0=key[0];
key[0]=key[n-1];
key[n-1]=key0;
n=n-1;
if(n>1)
{
Down(0);
}
}
//сортировка d-кучей
void HEAP :: HeapSorting()
{
int Size=n;
MakeQueue();
while(n>0)
{
MinOut();
}
n=Size;
}
Алгоритм быстрой сортировки
//быстрая сортировка
void QUICK :: QuickSorting(int left, int right)
{
int i, j, x, y;
i=left;
j=right;
x=key[(left+right)/2];
do
{
while(key[i]<x && i<right) i++;
while(x<key[j] && j>left) j--;
if(i<=j)
{
y=key[i];
key[i]=key[j];
key[j]=y;
i++;
j--;
}
}
while(i<=j);
if(left<j) QuickSorting(left, j);
if(i<right) QuickSorting(i, right);
}
