Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример оформления курсовой работы по СПП.doc
Скачиваний:
13
Добавлен:
15.03.2016
Размер:
660.48 Кб
Скачать

2 Алгоритм бинарного дерева

Сортировка с помощью бинарного дерева  — универсальный алгоритм сортировки, заключающийся в построении двоичного дерева поиска по ключам массива (списка), с последующей сборкой результирующего массива путём обхода узлов построенного дерева в необходимом порядке следования ключей. Данная сортировка является оптимальной при получении данных путём непосредственного чтения с потока (например, с файла, сокета или консоли) [6].

Реализация алгоритма бинарного дерева на языке С#:

class TreeItem

{

public int Value;

public TreeItem LeftChild;

public TreeItem RightChild;

}

class Tree

{

TreeItem top; int n = 0;

int[] a;

private void Add(int a)

{

TreeItem temp = new TreeItem();

temp.Value = a;

if (top == null)

{

top = temp;

return;

}

TreeItem t = top;

while (1 < 2)

{

if (a <= t.Value)

{

if (t.LeftChild != null)

{

t = t.LeftChild;

}

else

{

t.LeftChild = temp;

return;

}

}

else

{

if (t.RightChild != null)

{

t = t.RightChild;

}

else

{

t.RightChild = temp;

return;

}

}

}

}

private void Build(TreeItem t)

{

if (t.LeftChild != null)

Build (t.LeftChild);

a[n] = t.Value;

n++;

if (t.RightChild != null)

Build(t.RightChild);

}

public void Sort(int[] mas)

{

a = mas;

for (int i = 0; i < mas.Length; i++) Add(mas[i]);

Build(top);

}

}

Рисунок 3 – Реализация программы, которая сортирует по возрастанию массив из 3000 элементов методом бинарного дерева за 4 миллисекунды.

Рисунок 4 – Реализация программы, которая сортирует по убыванию массив из 3000 элементов методом бинарного дерева за 4 миллисекунды.

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

Основная стратегия ускорения алгоритмов сортировка - обмены между как можно более дальними элементами исходного файла - в методе быстрой сортировки реализована за счет того, что один из ключей в исходном файле используется для разделения его на два подфайла так, чтобы слева от выбранного элемента находились только элементы с меньшими ключами, а справа - только с большими. Элемент, разделяющий файл, помещается между его двумя подфайлами и процедура выполняется рекурсивно для каждой половины до тех пор, пока в очередном новом подфайле не окажется меньше, чем М элементов, где М - заранее выбранное число.

Сортировка подфайлов, содержащих меньше чем М элементов, выполняется каким-либо простым методом, например, простыми вставками. Таким образом, реализация метода зависит от двух параметров: значения М и способа выбора элемента, который предназначен для разделения файла на две части.

Блок выбора Х в простейшем случае формулируется как X=K[l], однако это может привести к крайне неэффективному алгоритму. Наиболее простое лучшее решение - выбирать Х как случайный ключ из диапазона K[l] ... K[r] и обменять его с K[l] [4].

Реализация алгоритма быстрой сортировки на языке С#:

class QuickSorting

{

public void sorting(int[] mas, long first, long last)

{

int p = mas[(last - first) / 2 + first];

int temp;

long i = first, j = last;

while (i <= j)

{

while (mas[i] < p && i <= last) ++i;

while (mas[j] > p && j >= first) --j;

if (i <= j)

{

temp = mas[i];

mas[i] = mas[j];

mas[j] = temp;

++i; --j;

}

}

if (j > first) sorting(mas, first, j);

if (i < last) sorting(mas, i, last);

}

}

Рисунок 5 – Реализация программы, которая сортирует по возрастанию массив из 3000 элементов методом быстрой сортировки за 1 миллисекунду.

Рисунок 6 – Реализация программы, которая сортирует по убыванию массив из 3000 элементов методом быстрой сортировки за 2 миллисекунды.