2 АЛГОРИТМИЧЕСКАЯ СЛОЖНОСТЬ
Алгоритм |
Структура |
Кол-во операций |
|
Время |
|
|
данных |
|
|
|
|
|
|
|
|
|
|
|
|
В лучшем |
В худшем |
В лучшем |
В худшем |
|
|
|
|
|
|
Сортировка |
Массив |
1233 |
1339 |
0,06 |
0,010 |
расческой |
|
|
|
|
|
|
|
|
|
|
|
Быстрая |
Массив |
606 |
706 |
0,239 |
0,192 |
сортировка |
|
|
|
|
|
|
|
|
|
|
|
Сортировка |
Массив |
4950 |
5000 |
0,01 |
0,010 |
выбором |
|
|
|
|
|
Таблица 1 — Сравнение средних значений алгоритмов
Исходя из данных, представленных в таблице, можно сделать вывод, что в лучшем исходе показания сортировок лучше, в отличие от худшего.
11
Заключение
В ходе выполнения практической работы было выявлено, что быстрая сортировка имеет наилучшую производительность O(n*logn)) и эффективна для любых размеров массива. Сортировка выбором O(n^2) крайне неэффективна для больших массивов. Сортировка расческой близка к O(n*logn), но уступает быстрой по скорости.
12
Приложение А
(обязательное) Сортировка расческой
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; |
|
|
} |
|
|
|
|
|
|
|
|
13
Console.WriteLine($"{size} \t{stopwatch.Elapsed.TotalMilliseconds:F6}\t{comparisons}\t\t{swaps}\t\t{comparisons +
swaps}" + (isSorted ? "" : " (НЕ ОТСОРТИРОВАНО)"));
} } }
14
