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 миллисекунды.