СД Практика 2
.pdfИз графического отображения полученных данных можно увидеть, что график лежит между эталонными, что подтверждает теорию.
11
3 Рассмотрение худших и лучших вариантов
После постройки графиков были проведены исследования на худший и лучший случай для каждой сортировки на массиве из 100 элементов, было проведено по 5 экспериментов для каждой и высчитано среднее значение тактов. Результаты исследования представлены в Таблице 3.1.
Таблица 3.1 – Результаты исследования
|
Сортировка |
Быстрая |
Сортировка |
|||
|
«расческой» |
сортировка |
вставками |
|||
|
|
|
|
|
|
|
|
Лучший |
Худший |
Лучший |
Худший |
Лучший |
Худший |
|
|
|
|
|
|
|
Число операций |
1233 |
1339 |
669 |
722 |
99 |
5049 |
|
|
|
|
|
|
|
Время (в мс) |
0,0207 |
0,0278 |
0,0178 |
0,0182 |
0,0111 |
0,0439 |
|
|
|
|
|
|
|
Анализируя данную таблицу, можно сделать вывод, что в худшем случае быстрая сортировка показывает лучший результат, а в лучшем случае самый быстрый результат показывает сортировка вставками.
12
Заключение
В ходе выполнения данной практической работы были приобретены навыки анализа результатов работы алгоритмов сортировки на основе использования различных входных данных, а также использования графиков для отображения результатов и анализа их построения, была проделана работа по написанию автоматического создания массивов разной длинны, подсчетов времени работы сортировок и упорядоченного вывода результатов в консоль, были проведены эксперименты с худшим и лучшим случаем сортировки. Полученные результаты сходятся с теоретическими данными.
13
Приложение А Сортировка расческой
try
{
Stopwatch Timer = new Stopwatch();
int[] n = new int[] { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
for (int i = 0; i < n.Length; i++)
{
int[] arr = new int[n[i]]; Random random = new Random();
for (int j = 0; j < arr.Length; j++)
{
arr[j] = random.Next(0, 1000000); if (j % 2 == 0)
{
arr[j] = arr[j] * -1;
}
}
Timer.Start();
double factor = 1.2473309; int step = n[i] - 1;
int action = 0; while (step >= 1)
{
for (int j = 0; j + step < n[i]; j++)
{
if (arr[j] > arr[j + step])
{
int temp = Convert.ToInt32(arr[i]);
14
arr[j] = arr[j + step];
arr[j + step] = temp;
action++;
}
action++;
}
step = Convert.ToInt32(Math.Floor(step / factor));
}
Timer.Stop();
Console.Write($"Длина массива: {n[i]}; Время: {Timer.ElapsedTicks}; Количество операций: {action}");
Console.WriteLine();
}
}
catch (Exception)
{
Console.WriteLine("Что-то пошло не так :(");
}
15
Приложение Б Быстрая сортировка
try
{
Stopwatch Timer = new Stopwatch(); int action = 0;
int[] n = new int[] { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
for (int i = 0; i < n.Length; i++)
{
int[] arr = new int[n[i]]; Random random = new Random();
for (int j = 0; j < arr.Length; j++)
{
arr[j] = random.Next(0, 1000000); if (j % 2 == 0)
{
arr[j] = arr[j] * -1;
}
}
void quick_sorting(int[] arr, int l, int r)
{
int temp;
int x = arr[l + (r - l) / 2]; int i = l;
int j = r; while (i <= j)
{
while (arr[i] < x) i++; while (arr[j] > x) j--;
16
if (i <= j)
{
temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; action++;
i++; j--;
}
}
if (i < r)
{
quick_sorting(arr, i, r);
}
if (l < j)
{
quick_sorting(arr, l, j);
}
}
Timer.Start(); quick_sorting(arr, 0, n[i] - 1); Timer.Stop();
Console.Write($"Длина массива: {n[i]}; Время: {Timer.ElapsedTicks}; Количество операций: {action}");
Console.WriteLine();
}
}
catch (Exception)
{
17
Console.WriteLine("Что-то пошло не так :(");
}
18
Приложение В Сортировка вставками
try
{
Stopwatch Timer = new Stopwatch(); int action = 0;
int[] n = new int[] { 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100, 150, 200, 250, 300, 400, 500, 600, 800, 1000 };
for (int i = 0; i < n.Length; i++)
{
int[] arr = new int[n[i]]; Random random = new Random();
for (int j = 0; j < arr.Length; j++)
{
arr[j] = random.Next(0, 1000000); if (j % 2 == 0)
{
arr[j] = arr[j] * -1;
}
}
Timer.Start();
for (int j = 1; j < n[i]; j++)
{
int x = arr[j]; int l = i;
while (l > 0 && (x < arr[l - 1]))
{
arr[l] = arr[l - 1]; l--;
action++;
19
}
arr[l] = x; action++;
}
Timer.Stop();
Console.Write($"Длина массива: {n[i]}; Время: {Timer.ElapsedTicks}; Количество операций: {action}");
Console.WriteLine();
}
}
catch(Exception)
{
Console.WriteLine("Что-то пошло не так :(");
}
20
