2 Алгоритмическая сложность
Алгоритм |
Структура данных |
Кол-во операций |
Время |
||
|
В лучшем |
В худшем |
В лучшем |
В худшем |
|
Сортировка расческой |
Массив |
1233 |
1339 |
0.06 |
0.010 |
Быстрая сортировка |
Массив |
606 |
706 |
0.239 |
0.192 |
Сортировка выбором |
Массив |
4950 |
5000 |
0.01 |
0.010 |
Таблица 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)
{
int[] arr = new int[size];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = -random.Next(1, 1000001); // от -1000000 до -1
}
int[] arrCopy = (int[])arr.Clone();
long comparisons = 0;
long swaps = 0;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// Реализация сортировки расческой (comb sort)
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++; // счетчик перестановок
int temp = arrCopy[i];
arrCopy[i] = arrCopy[i + step];
arrCopy[i + step] = temp;
}
}
step = (int)(step / factor);
}
stopwatch.Stop();
// Проверка корректности сортировки
bool isSorted = true;
for (int i = 0; i < n - 1; i++)
{
if (arrCopy[i] > arrCopy[i + 1])
{
isSorted = false;
break;
}
}
Console.WriteLine($"{size}\t{stopwatch.Elapsed.TotalMilliseconds:F6}\t{comparisons}\t\t{swaps}\t\t{comparisons + swaps}" +
(isSorted ? "" : " (НЕ ОТСОРТИРОВАНО)"));
}
}
}
