
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра безопасности информационных систем (БИС)
СОРТИРОВКИ МАССИВОВ
Отчет по практической работе №1
по дисциплине «Структуры данных»
Студент гр. 733-1
_______ Сметанников Д.Е
_______
Принял:
преподаватель КИБЭВС
_______ Д.Р. Уразаев
_______
Задание
Реализуйте сортировку расческой, быструю сортировку и еще одну по варианту. Продемонстрируйте на входных данных работоспособность вашего приложения и корректность реализации алгоритма сортировки. Реализуйте соответствующий варианту задания генератор входных данных.
Не используйте дополнительные массивы при реализации всех сортировок.
Размер массива выбирайте в диапазоне 20-100 элементов.
Вариант 3 .Третья сортировка - сортировка обменом. Входные данные представлены только отрицательными числами с плавающей точкой (использовать float).
Содержание
Задание 2
1 Введение 4
2 Ход работы 5
2.1 Сортировка расческой 5
2.2 Быстрая сортировка 5
2.3 Сортировка обменом 6
3 Алгоритмическая сложность 9
Заключение 10
Приложение А 11
Приложение Б 13
Приложение В 15
Введение
Целью данной работы является изучение и практическая реализация различных алгоритмов сортировки, таких как сортировка расческой, быстрая сортировка и сортировка обменом (пузырьком), на языке программирования C#.
Ход работы
1
2
2.1Сортировка расческой
Сортировка расческой — это улучшенная версия пузырьковой сортировки. Вместо того, чтобы сравнивать только соседние элементы, этот алгоритм начинает с большого шага между элементами, который постепенно уменьшается. Шаг сравнения изначально большой, а затем уменьшается до 1 (как при пузырьковой сортировке). Это помогает быстрее перемещать большие и маленькие элементы к их правильным местам.
На рисунке 2.1 представлен результат работы программы.
Рисунок
2.1 – Сортировка расческой
В приложении А представлен листинг программы сортировки расческой.
2.2Быстрая сортировка
Быстрая сортировка — это эффективный алгоритм сортировки, который работает, выбирая опорный элемент (пивот) и разделяя массив на две части: те, что меньше пивота, и те, что больше. Затем она рекурсивно сортирует эти две части.
На рисунке 2.2 представлен результат работы программы.
Рисунок 2.2 – Быстрая сортировка
В приложении Б представлен листинг программы быстрой сортировки.
2.3Сортировка обменом
Сортировка обменом — это способ упорядочить числа, сравнивая каждую пару соседних элементов и меняя их местами, если они стоят не в том порядке. Так большие числа постепенно "всплывают" наверх, как пузырьки в воде.
На рисунке 2.3 представлена блок-схема алгоритма сортировки обменом.
Р
исунок
2.3 – Блок-схема сортировки обменом
На рисунке 2.4 представлен результат работы программы.
Рисунок 2.4 – Сортировка обменом
В приложении В представлен листинг программы сортировки обменом.
3Алгоритмическая сложность
Алгоритм |
Структура данных |
Временная сложность |
Вспомогательные данные |
||
|
|
Лучшее |
В среднем |
В худшем |
В худшем |
Сортировка расческой |
Массив |
O(n log(n)) |
Ω(n^2 / 2^F) |
O(n^2) |
O(1) |
Быстрая сортировка |
Массив |
O(n log(n)) |
O(n log(n)) |
O(n^2) |
O(n) |
Пузырьковая сортировка |
Массив |
O(n) |
O(n^2) |
O(n^2) |
O(1) |
Таблица 1 — Сравнение алгоритмической сложности алгоритмов
Заключение
В ходе выполнения практической работы были успешно реализованы и протестированы три алгоритма сортировки: сортировка расческой, быстрая сортировка и сортировка обменом.
Наиболее затруднительным было выполнение быстрой сортировки.
Приложение А
(обязательное)
Сортировка расческой
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("сортировка расческой:");
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 pivot = arr[l + (r - l) / 2];
while (i <= j)
{
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j)
{
float temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; j--;
}
}
if (i < r) { quicksort(arr, i, r); }
if (l < j) { quicksort(arr, l, j); }
}
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}" + " ");
}
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("Быстрая сортировка:");
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("Сортировка обменом:");
foreach (var item in arr)
{
Console.Write($"{item:F2} ");
}
Томск 2024