Практики(Вариант №7) / Практическая работа №1
.odtМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
СОРТИРОВКИ МАССИВОВ Отчет по практической работе №1 по дисциплине «Структуры данных»
Студент гр. 734-1
________ Р.Е. Ситарь
__.__.2025
Принял
Преподаватель
кафедры КИБЭВС
________ Д.Р. Уразаев
__.__.2025
Задание
Реализуйте сортировку расческой, быструю сортировку и еще одну по варианту. Продемонстрируйте на входных данных работоспособность вашего приложения и корректность реализации алгоритма сортировки. Реализуйте соответствующий варианту задания генератор входных данных.
Не используйте дополнительные массивы при реализации всех сортировок.
Размер массива выбирайте в диапазоне 20-100 элементов.
Вариант 7. Третья сортировка - сортировка обменом. Входные данные представлены только положительными числами с плавающей точкой (использовать float).
Оглавление
Задание 2
Введение 4
1 ХОД РАБОТЫ 5
1.1 Сортировка расческой 5
1.2 Быстрая сортировка 6
1.3 Сортировка обменом 7
2 АЛГОРИТМИЧЕСКАЯ СЛОЖНОСТЬ 10
Заключение 11
Приложение А 12
Приложение Б 13
Приложение В 14
Введение
Целью данной работы является изучение и практическая реализация различных алгоритмов сортировки, таких как сортировка расческой, быстрая сортировка и сортировка обменом (пузырьком), на языке программирования C#.
1 ХОД РАБОТЫ
1.1 Сортировка расческой
Сортировка расческой — это улучшенная версия пузырьковой сортировки. Вместо того, чтобы сравнивать только соседние элементы, этот алгоритм начинает с большого шага между элементами, который постепенно уменьшается. Шаг сравнения изначально большой, а затем уменьшается до 1 (как при пузырьковой сортировке). Это помогает быстрее перемещать большие и маленькие элементы к их правильным местам.
На рисунке 1.1 представлен результат работы программы.
Р
исунок
1.1 — Сортировка
расческой
В приложении А представлен код программы для сортировки расческой.
1.2 Быстрая сортировка
Быстрая сортировка — это эффективный алгоритм сортировки, который работает, выбирая опорный элемент и разделяя массив на две части: те, что меньше опорного элемента, и те, что больше. Затем она рекурсивно сортирует эти две части.
На рисунке 1.2 представлен результат работы программы.
Р
исунок
1.2 — Быстрая
сортировка
В приложении Б представлен код программы для быстрой сортировки.
1.3 Сортировка обменом
Сортировка обменом — это способ упорядочить числа, сравнивая каждую пару соседних элементов и меняя их местами, если они стоят не в том порядке. Так большие числа постепенно "всплывают" наверх, как пузырьки в воде.
На рисунке 1.3 представлена блок-схема алгоритма сортировки обменом.
Р
исунок
1.3
— Блок-схема
сортировки обменом
На рисунке 1.4 представлен результат работы программы.
Р
исунок
1.4 — Сортировка
обменом
В приложении В представлен код программы для быстрой сортировки.
2 АЛГОРИТМИЧЕСКАЯ СЛОЖНОСТЬ
Алгоритм |
Структура данных |
Временная сложность |
||
|
|
Лучшее |
В среднем |
В худшем |
Сортировка расческой |
Массив |
O(n log(n)) |
O(n^2 / 2^F) |
O(n^2) |
Быстрая сортировка |
Массив |
O(n log(n)) |
O(n log(n)) |
O(n^2) |
Сортировка обменом |
Массив |
O(n) |
O(n^2) |
O(n^2) |
Таблица 1 — Сравнение алгоритмической сложности алгоритмов
Заключение
В процессе выполнения практической работы была достигнута поставленная цель: реализовать и протестировать три алгоритма сортировки: сортировка расческой, быстрая сортировка и сортировка обменом. Также согласно варианту №7 была реализована сортировка обменом и составлена блок-схема.
Приложение А
(обязательное)
Сортировка расческой
float[] arr = new float[25];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = (float)(random.NextDouble() * 100);
}
Console.WriteLine("Исходный массив:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
int n = arr.Length;
double factor = 1.2473309;
int step = n - 1;
while (step >= 1)
{
for (int i = 0; i + step < n; i++)
{
if (arr[i] > arr[i + step])
{
float temp = arr[i];
arr[i] = arr[i + step];
arr[i + step] = temp;
}
}
step = (int)(step / factor);
}
Console.WriteLine("\nСортировка расческой:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
Приложение Б
(обязательное)
Быстрая сортировка
static void quicksort(float[] arr, int l, int r)
{
int i = l;
int j = r;
float opora = arr[l + (r - l) / 2];
while (i <= j)
{
while (arr[i] < opora) i++;
while (arr[j] > opora) j--;
if (i <= j)
{
float temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; j--;
}
}
if (l < j) { quicksort(arr, l, j); } // левая часть
if (i < r) { quicksort(arr, i, r); } // правая часть
}
float[] arr = new float[25];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = (float)(random.NextDouble() * 100);
}
Console.WriteLine("Исходный массив:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
Console.WriteLine();
quicksort(arr, 0, arr.Length - 1);
Console.WriteLine("\nБыстрая сортировка:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
Приложение В
(обязательное)
Сортировка обменом
float[] arr = new float[25];
Random random = new Random();
for (int i = 0; i < arr.Length; i++)
{
arr[i] = (float)(random.NextDouble() * 100);
}
Console.WriteLine("Исходный массив:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
int k = arr.Length;
bool swapped;
for (int i = 0; i < k - 1; i++)
{
swapped = false;
for (int j = 0; j < k - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
float temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped)
break;
}
Console.WriteLine("\nСортировка обменом:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
