Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СиАОД_ЛабРаб-1_Вар9

.docx
Скачиваний:
0
Добавлен:
18.01.2026
Размер:
144.49 Кб
Скачать

Федеральное агентство связи

Ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Кафедра Математической Кибернетики и Информационных Технологий

Отчет по лабораторной работе

по предмету «СиАОД»

на тему:

«Методы сортировки»

Руководитель:

Кутейников Иван Алексеевич

Москва 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#, ей немного уступила быстрая сортировка. Сортировка обменом показала на порядок более худшие результаты, кроме того, по мере роста массива ее результат ухудшался драматически.