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);
}