2 АЛГОРИТМИЧЕСКАЯ СЛОЖНОСТЬ
Алгоритм |
Структура |
Кол-во операций |
|
Время |
|
|
данных |
|
|
|
|
|
|
|
|
|
|
|
|
В лучшем |
В худшем |
В лучшем |
В худшем |
|
|
|
|
|
|
Сортировка |
Массив |
1233 |
1339 |
0,06 |
0,010 |
расческой |
|
|
|
|
|
|
|
|
|
|
|
Быстрая |
Массив |
606 |
561 |
0,239 |
0,192 |
сортировка |
|
|
|
|
|
|
|
|
|
|
|
Пузырьковая |
Массив |
99 |
9900 |
0 |
0,030 |
сортировка |
|
|
|
|
|
Таблица 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)
{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}");
} } }
13
Приложение Б
(обязательное) Быстрая сортировка
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 |
|
|
|
14 |
|
|
|
} |
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); |
// правая часть |
|
|
|
} |
|||
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
15
