СиАОД_ЛабРаб-1_Вар9
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Математической Кибернетики и Информационных Технологий
Отчет по лабораторной работе
по предмету «СиАОД»
на тему:
«Методы сортировки»
Руководитель:
Кутейников Иван Алексеевич
Москва 2024
Цель работы
Реализовать заданный метод сортировки числовой матрицы в соответствии с индивидуальным заданием. Для всех вариантов добавить реализацию быстрой сортировки (quicksort). Оценить время работы каждого алгоритма сортировки и сравнить его со временем стандартной функции сортировки, используемой в выбранном языке программирования.
Вариант 9: Сортировка обменом
Ход работы
В соответствии с заданием реализовал алгоритм быстрой сортировки на языке C#:
public static int[] QuickSort(int[] array, int leftIndex, int rightIndex)
{
var i = leftIndex;
var j = rightIndex;
var pivot = array[leftIndex];
while (i <= j)
{
while (array[i] < pivot)
{
i++;
}
while (array[j] > pivot)
{
j--;
}
if (i <= j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
Затем реализовал алгоритм сортировки обменом:
static int[] SelectionSort(int[] nums)
{
int index = 0;
for (int i = 0; i < nums.Length; i++)
{
index = i;
for (int j = i; j < nums.Length; j++)
{
if (nums[j] < nums[index])
{
index = j;
}
}
if (nums[i] == nums[index])
{
continue;
}
int tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
}
return nums;
}
Сравнение времени выполнения алгоритмов для массива размером 10 тысяч элементов:
n |
Быстрая сортировка, мс |
Сортировка обменом, мс |
Стандартная сортировка, мс |
1 |
0,75 |
53,79 |
0,34 |
2 |
0,89 |
53,74 |
0,38 |
3 |
1,07 |
55,9 |
0,35 |
4 |
1,04 |
52,63 |
0,37 |
5 |
0,74 |
54,38 |
0,39 |
Средний показатель по итогам 5 экспериментов:
Быстрая сортировка: 0,90 мс
Сортировка обменом: 54,09 мс
Стандартная сортировка: 0,37 мс
Самой быстрой оказалась стандартная сортировка, а сортировка обменом показала худший результат.
Сравнение времени выполнения алгоритмов для массива размером 100 тысяч элементов:
n |
Быстрая сортировка, мс |
Сортировка обменом, мс |
Стандартная сортировка, мс |
1 |
6,4 |
5556,4 |
3,2 |
2 |
6,9 |
5347,1 |
3,2 |
3 |
6,5 |
5412,5 |
3,7 |
4 |
6,1 |
5304,8 |
3,4 |
5 |
5,9 |
5316,9 |
3,2 |
Средний показатель по итогам 5 экспериментов:
Быстрая сортировка: 6,4 мс
Сортировка обменом: 5387,5 мс
Стандартная сортировка: 3,3 мс
В результате увеличение массива в 10 раз, скорость сортировки обменом уменьшилась на два порядка, а скорость стандартной сортировки – на порядок. В результате самой быстрой вновь стала стандартная сортировка, однако при увеличение размера массива она может поравняться с быстрой.
Обращаем внимание на то, что при сортировках использовался одинаковый массив случайно сгенерированных чисел от 1 до 999.
Код программы
using System;
using System.Diagnostics;
namespace LR1
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите количество элементов массива:");
int n = int.Parse(Console.ReadLine());
int[] nums = new int[n];
FillingArray(nums);
//Console.WriteLine("Неотсортированный массив:");
//OutArray(nums);
Console.WriteLine("");
Console.WriteLine($"Количество элементов массива: {n}");
Console.WriteLine("");
Stopwatch sw = new Stopwatch();
sw.Restart();
QuickSort(nums, 0, nums.Length - 1);
sw.Stop();
Console.WriteLine($"Быстрая сортировка, длительность {sw.Elapsed}");
//OutArray(nums);
FillingArray(nums);
Console.WriteLine("");
sw.Restart();
SelectionSort(nums);
sw.Stop();
Console.WriteLine($"Сортировка обменом, длительность {sw.Elapsed}");
//OutArray(nums);
Console.WriteLine("");
FillingArray(nums);
sw.Restart();
Array.Sort(nums);
sw.Stop();
Console.WriteLine($"Стандартная функция сортировки, длительность {sw.Elapsed}");
// OutArray(nums);
}
//Быстрая сортировка
public static int[] QuickSort(int[] array, int leftIndex, int rightIndex)
{
var i = leftIndex;
var j = rightIndex;
var pivot = array[leftIndex];
while (i <= j)
{
while (array[i] < pivot)
{
i++;
}
while (array[j] > pivot)
{
j--;
}
if (i <= j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
if (leftIndex < j)
QuickSort(array, leftIndex, j);
if (i < rightIndex)
QuickSort(array, i, rightIndex);
return array;
}
//Сортировка обменом
static int[] SelectionSort(int[] nums)
{
int index = 0;
for (int i = 0; i < nums.Length; i++)
{
index = i;
for (int j = i; j < nums.Length; j++)
{
if (nums[j] < nums[index])
{
index = j;
}
}
if (nums[i] == nums[index])
{
continue;
}
int tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
}
return nums;
}
//Вывод элементов массива
static void OutArray(int[] nums)
{
for (int i = 0; i < nums.Length; i++)
{
Console.Write($"{nums[i]} ");
}
}
//Заполнение массива
static int[] FillingArray(int[] nums)
{
var random = new Random(20);
for (int i = 0; i < nums.Length; i++)
{
nums[i] = random.Next(1, 999);
}
return nums;
}
}
}
Вывод
Для выполнения лабораторной работы был написан код программы, сортирующей заданный массив тремя разными алгоритмами: быстрой сортировкой, сортировкой обменом и стандартной сортировкой. В ходе работы было выяснено, какой из алгоритмов быстрее других справляется с поставленной задачей.
По итогам экспериментов быстрее других с задачей справилась встроенная сортировка языка C#, ей немного уступила быстрая сортировка. Сортировка обменом показала на порядок более худшие результаты, кроме того, по мере роста массива ее результат ухудшался драматически.
