Uploaded by Илья Захаров

Отчёт

advertisement
Министерство науки и высшего образования РФ ФГБОУ ВО
Заполярный государственный институт имени Н.М.Федоровского
Теория алгоритмов
Лабораторная работа № 1
Вариант 3
Тема: «Сложность алгоритмов»
Работу выполнили:
Студенты группы ИС – 22
Захаров Илья,
Шелепов Денис,
Логачев Андрей
Работу проверил:
Фаддеенков Андрей Владимирович
Норильск, 2024
Задание:
Имеется три вида сортировки: сортировка пузырьком, сортировка
вставками, быстрая сортировка.
Написать программу, которая будет сравнивать эти виды сортировок.
Для реализации данного задания был выбран язык программирования
C#.
Написанная программа проводила подсчет операций в каждой из
сортировок и выводила данные в файл с расширением xlsx. По итогам работы
программы были получены следующие значения:
Рис1. Таблица количества операций для разных сортировок разной размерности и процента
случайности заполнения
На основании этих данных были построены графики показывающие как
изменялось количество итераций сортировки в зависимости от процента
случайности заполнения массива и размера.
Рис2 . График изменения количества итераций для Bubble sort
Рис3. График изменения количества итераций для Insert sort
Рис4. График изменения количества итераций для Quick sort
Исходя из проведенного теста, анализируя графики можно заметить, что
при сортировке пузырьком при изменении размерности массива в 2 раза
количество итераций увеличивается в 4 раза, откуда можно сделать вывод что
сложность пузырьковой сортировки O(n2).
Аналогичные изменения наблюдаются у сортировки вставками,
следовательно ее сложность O(n2).
Изменение логарифма при входных данных в два раза, количество
теоретических итераций увеличилось в два раза, на практике наблюдается
подобная картина с учетом погрешностей, следовательно сложность быстрой
сортировки O(nlog(n)).
Листинг программы:
using Spire.Xls;
int[] amount = { 10, 100, 200, 500, 1000, 2000, 5000, 10000 };
int percent = 0;
const int num_rows = 16;
const int num_cols = 8;
int[] forBubble = { };
int[] forQuick = { };
int[] forInsert = { };
Random rand = new Random();
int temp = 0;
int counter = 0;
int[] arr;
//Create a partially or completely random array
int[] GeneratePercentRandomArray(int amount, double percent)
{
double new_percent = 0;
if (percent != 0) new_percent = percent / 100;
for (int i = 0; i < amount; i++)
{
if (percent == 0) arr[i] = rand.Next(0, 10000);
else if (percent == 100) arr[i] = i;
else
{
switch (percent)
{
case 50:
arr[i] = i % 2 == 0 ? rand.Next(0, 10000) : i;
break;
case -1:
arr[i] = amount - i;
break;
}
}
}
return arr;
}
string path = "C:\\Users\\Денис\\source\\repos\\SortCollection\\SortCollection\\testSheet.xlsx";
Workbook wb = new Workbook();
Worksheet ws = wb.Worksheets[0];
//Внесение шаблона в excel
void excelPattern()
{
ws.Range[1, 1].Value = "Bubble sort time";
ws.Range[2, 2].Value = "Sorted percent";
ws.Range[3, 2].Value = "0%";
ws.Range[4, 2].Value = "50%";
ws.Range[5, 2].Value = "100%";
ws.Range[6, 2].Value = "-100%";
ws.Range[1, 3].Value = "ArraySize";
ws.Range[1, 4].Value = "10";
ws.Range[1, 5].Value = "100";
ws.Range[1, 6].Value = "200";
ws.Range[1, 7].Value = "500";
ws.Range[1, 8].Value = "1000";
ws.Range[1, 9].Value = "2000";
ws.Range[1, 10].Value = "5000";
ws.Range[1, 11].Value = "10000";
ws.Range[7, 1].Value = "Insert sort time";
ws.Range[7, 2].Value = "Sorted percent";
ws.Range[8, 2].Value = "0%";
ws.Range[9, 2].Value = "50%";
ws.Range[10, 2].Value = "100%";
ws.Range[11, 2].Value = "-100%";
ws.Range[12, 1].Value = "Quick sort time";
ws.Range[12, 2].Value = "Sorted percent";
ws.Range[13, 2].Value = "0%";
ws.Range[14, 2].Value = "50%";
ws.Range[15, 2].Value = "100%";
ws.Range[16, 2].Value = "-100%";
ws.AllocatedRange.AutoFitColumns();
wb.SaveToFile(path);
}
//excelPattern();
void BubbleSort(int[] notSorted) {
bool isSorted = false;
forBubble = notSorted;
for (int i = 0; i < forBubble.Length; i++)
{
for (int j = 0; j < forBubble.Length - 1; j++)
{
//counter++;
if (forBubble[i] < forBubble[j])
{
temp = forBubble[i];
forBubble[i] = forBubble[j];
forBubble[j] = temp;
isSorted = true;
//counter++;
}
counter++;
}
counter++;
if (!isSorted) break;
}
}
void startQuickSort(int[] notSorted)
{
forQuick = notSorted;
QuickSort(notSorted, 0, forQuick.Length - 1);
}
void QuickSort(int[] forQuick, int left, int right)
{
var i = left;
var j = right;
var pivot = forQuick[left];
//counter++; //тоже сравнение только вне цикла 1
while (i <= j) //цикл 1
{
counter++; //счет количества итерация внутри цикла 1
//counter++;
while (forQuick[i] < pivot) //цикл 2
{
counter++; //счет количества итерация внутри цикла 2
i++;
}
//counter++;
while (forQuick[j] > pivot) //цикл 3
{
counter++; //счет количества итерация внутри цикла 3
j--;
}
//counter++; //подсчет сравнений цикла if
if (i <= j)
{
int temp = forQuick[i];
forQuick[i] = forQuick[j];
forQuick[j] = temp;
i++;
j--;
counter++; //счет количества перестановок
}
}
//counter++; //подсчет сравнений цикла if
if (left < j) {
QuickSort(forQuick, left, j);
}
//counter++; //подсчет сравнений цикла if
if (i < right)
{
QuickSort(forQuick, i, right);
}
}
void InsertSort(int[] notSorted)
{
forInsert = notSorted;
int val = 0;
for (int i = 1; i < forInsert.Length; i++)
{
val = forInsert[i];
for (int j = i - 1; j >= 0;)
{
//counter++; //подсчет сравнений цикла if
if (val < forInsert[j])
{
forInsert[j + 1] = forInsert[j];
j--;
forInsert[j + 1] = val;
//counter++; //подсчет перестановки
}
else
{
break;
}
counter++;
}
counter++;
}
}
for (int i = 3; i < num_rows+1; i++)
{
percent = 0;
for (int j = 4; j < num_cols + 4; j++)
{
arr = new int[amount[j-4]];
GeneratePercentRandomArray(amount[j-4], percent);
if (i < 7)
{
BubbleSort(arr);
ws.Range[i, j].Value = counter.ToString();
}
else if (i >= 8 && i < 12)
{
InsertSort(arr);
ws.Range[i, j].Value = counter.ToString();
}
else if (i > 12)
{
startQuickSort(arr);
ws.Range[i, j].Value = counter.ToString();
}
counter = 0;
}
percent = percent == 100 ? -1 : percent += 50;
}
wb.SaveToFile(path);
excelPattern();
Download