
Практическая работа №2
.pdf1.4 Алгоритмическая сложность
Втаблице 1.4 представлено время выполнения алгоритмов,
реализованных в данной работе, количество операций в лучшем и худшем
случаях.
Таблица 1.4 – Алгоритмическая сложность
|
Номер |
|
Лучший случай |
Худший случай |
|
|
|
|
|
|
измерения |
|
|
|
|
|
Время выполнения, такт |
||
|
|
|
||
|
|
|
|
|
|
1 |
|
35 |
47 |
|
|
|
|
|
|
2 |
|
37 |
49 |
|
|
|
|
|
|
3 |
|
37 |
48 |
|
|
|
|
|
Сортировка |
4 |
|
35 |
50 |
расческой |
|
|
|
|
5 |
|
38 |
52 |
|
|
|
|||
|
|
|
|
|
|
Среднее значение |
|
36,4 |
49,2 |
|
|
|
|
|
|
Количество |
|
1251 |
1357 |
|
операций |
|
||
|
|
|
|
|
|
|
|
|
|
|
1 |
|
22 |
23 |
|
|
|
|
|
|
2 |
|
29 |
33 |
|
|
|
|
|
|
3 |
|
23 |
31 |
|
|
|
|
|
Быстрая |
4 |
|
36 |
44 |
сортировка |
|
|
|
|
5 |
|
22 |
25 |
|
|
|
|||
|
|
|
|
|
|
Среднее значение |
|
26,4 |
31,2 |
|
|
|
|
|
|
Количество |
|
984 |
1135 |
|
операций |
|
||
|
|
|
|
|
|
|
|
|
|
|
11 |
|
|
Продолжение таблицы 1.4
|
1 |
143 |
277 |
|
|
|
|
|
|
|
2 |
143 |
277 |
|
|
|
|
|
|
|
3 |
136 |
274 |
|
|
|
|
|
|
Сортировка |
4 |
147 |
299 |
|
обменом |
|
|
|
|
5 |
142 |
289 |
||
|
||||
|
|
|
|
|
|
Среднее значение |
142,2 |
283,2 |
|
|
|
|
|
|
|
Количество |
4950 |
9900 |
|
|
операций |
|||
|
|
|
||
|
|
|
|
Анализируя данную таблицу, можно сделать вывод, что лучшие результаты показывает быстрая сортировка.
12
Заключение
В ходе данной работы были оценена алгоритмическая сложность сортировки расческой, быстрой сортировки и сортировки обменом.
Результаты работы совпали с теоретическими. Отчет был написан согласно ОС ТУСУР 01-2021.
13
Приложение А
Сортировка расческой
int counter = 0;
void rascheska(float[] array, int length)
{
double factor = 1.2473309; int step = length - 1; counter++;
while (step >= 1)
{
for (int i = 0; i + step < length; i++)
{
counter++;
if (array[i] > array[i + step])
{
counter++;
float temp = array[i]; array[i] = array[i + step]; array[i + step] = temp;
}
}
counter++;
step = Convert.ToInt32(Math.Floor(step / factor));
}
}
void FillArray(float[] array, int length)
{
float a = 0.001f;
for (int i = 0; i < length; i++)
{
array[length - i - 1] = (length - i) * a * (-1);
}
}
int[] lengths = { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
float[] array; int l;
DateTime time1, time2;
for (int i = 0; i < lengths.Length; i++)
{
l = lengths[i]; Console.Write($"{l}\t"); array = new float[l]; FillArray(array, l); time1 = DateTime.Now; rascheska(array, l); time2 = DateTime.Now;
Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\t"); counter = 0;
time1 = DateTime.Now; rascheska(array, l); time2 = DateTime.Now;
Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\n");
}
14
Приложение Б
Быстрая сортировка
int counter = 0;
void quickSort(float[] a, int l, int r)
{
float x = a[(l + r) / 2]; int i = l;
int j = r; counter++; while (i <= j)
{
counter++;
while (a[i] < x)
{
i++;
counter++;
}
counter++;
while (a[j] > x)
{
j--; counter++;
}
counter++; if (i <= j)
{
counter++;
float temp = a[i]; a[i] = a[j];
a[j] = temp; i++;
j--;
}
counter++;
}
counter++; if (i < r)
quickSort(a, i, r); counter++;
if (l < j)
quickSort(a, l, j);
}
void FillArray(float[] array, int length)
{
float a = 0.001f;
for (int i = 0; i < length; i++)
{
array[length - i - 1] = (length - i) * a * (-1);
}
}
int[] lengths = {1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
float[] array; int l;
DateTime time1, time2;
for (int i = 0; i < lengths.Length; i++)
{
l = lengths[i]; Console.Write($"{l}\t"); array = new float[l]; FillArray(array, l);
15
time1 = DateTime.Now; quickSort(array, 0, l - 1); time2 = DateTime.Now;
Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\t"); counter = 0;
time1 = DateTime.Now; quickSort(array, 0, l - 1); time2 = DateTime.Now;
Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\n"); counter = 0;
}
16
Приложение В
Сортировка обменом
int counter = 0;
void bubble(float[] array, int length)
{
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
counter++;
if (array[j] > array[j + 1])
{
counter++;
float temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp;
}
}
}
}
void FillArray(float[] array, int length) // функция для заполнения массива случайными числами
{
float a = 0.001f;
for (int i = 0; i < length; i++)
{
array[length - i - 1] = (length - i) * a * (-1);
}
}
int[] lengths = { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
float[] array; int l;
DateTime time1, time2;
for (int i = 0; i < lengths.Length; i++)
{
l = lengths[i]; Console.Write($"{l}\t"); array = new float[l]; FillArray(array, l); time1 = DateTime.Now; bubble(array, l);
time2 = DateTime.Now; Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\t"); counter = 0;
time1 = DateTime.Now; bubble(array, l); time2 = DateTime.Now;
Console.Write($"{counter}\t{time2.Ticks - time1.Ticks}\n"); counter = 0;
}
17