2 Алгоритмическая сложность
Алгоритм |
Структура данных |
Кол-во операций |
Время |
||
|
В лучшем |
В худшем |
В лучшем |
В худшем |
|
Сортировка расческой |
Массив |
1233 |
1339 |
0.06 |
0.010 |
Быстрая сортировка |
Массив |
606 |
561 |
0.239 |
0.192 |
Пузырьковая сортировка |
Массив |
99 |
9900 |
0 |
0.030 |
Таблица 1 — Сравнение средних значений алгоритмов
Исходя из данных, представленных в таблице, можно сделать вывод, что в лучшем исходе показания сортировок лучше, в отличие от худшего.
Заключение
В ходе выполнения практической работы было выявлено, что быстрая сортировка имеет наилучшую производительность O(n*logn)) и эффективна для любых размеров массива. Сортировка обменом O(n^2) крайне неэффективна для больших массивов. Сортировка расческой близка к O(n*logn), но уступает быстрой по скорости.
Приложение а
(обязательное)
Сортировка расческой
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
int[] sizes = { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
Console.WriteLine("Размер\tВремя (мс)\tСравнения\tПерестановки\tВсего операций");
Console.WriteLine(new string('-', 60));
foreach (int size in sizes)
{
float[] arr = new float[size];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = (float)(random.NextDouble() * 100);
}
float[] arrCopy = (float[])arr.Clone();
long comparisons = 0;
long swaps = 0;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int n = arrCopy.Length;
double factor = 1.2473309;
int step = n - 1;
while (step >= 1)
{
for (int i = 0; i + step < n; i++)
{
comparisons++; // счетчик сравнений
if (arrCopy[i] > arrCopy[i + step])
{
swaps++; // счетчик перестановок
float temp = arrCopy[i];
arrCopy[i] = arrCopy[i + step];
arrCopy[i + step] = temp;
}
}
step = (int)(step / factor);
}
stopwatch.Stop();
Console.WriteLine($"{size}\t{stopwatch.Elapsed.TotalMilliseconds:F6}\t{comparisons}\t\t{swaps}\t\t{comparisons + swaps}");
}
}
}
Приложение б
(обязательное)
Быстрая сортировка
using System;
using System.Diagnostics;
class Program
{
static long comparisons = 0;
static long swaps = 0;
static void Main()
{
int[] sizes = { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
Console.WriteLine("Быстрая сортировка - Результаты:");
Console.WriteLine("Размер\tВремя (мс)\tСравнения\tПерестановки\tВсего операций");
Console.WriteLine(new string('-', 60));
foreach (int size in sizes)
{
comparisons = 0;
swaps = 0;
float[] arr = new float[size];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = (float)(random.NextDouble() * 100);
}
float[] arrCopy = (float[])arr.Clone();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
quicksort(arrCopy, 0, arrCopy.Length - 1);
stopwatch.Stop();
Console.WriteLine($"{size}\t{stopwatch.Elapsed.TotalMilliseconds:F6}\t{comparisons}\t\t{swaps}\t\t{comparisons + swaps}");
}
}
static void quicksort(float[] arr, int l, int r)
{
comparisons++;
if (l >= r) return;
int i = l;
int j = r;
float opora = arr[l + (r - l) / 2];
while (i <= j)
{
while (arr[i] < opora)
{
comparisons++; // счетчик для сравнения в while
i++;
}
while (arr[j] > opora)
{
comparisons++; // счетчик для сравнения в while
j--;
}
if (i <= j)
{
swaps++; // счетчик перестановок
float temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
if (l < j)
{
quicksort(arr, l, j); // левая часть
}
if (i < r)
{
quicksort(arr, i, r); // правая часть
}
}
}
