
Практическая работа №1
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
«Сортировка» Отчет по практической работе №1
по дисциплине «Структуры данных»
Студент гр. 723-1
_________Лысенко Е.М.
__________
Принял Ст. преподаватель кафедры КИБЭВС
________ Лунѐва Е.Е.
__________
Томск 2024
Задание
Реализуйте сортировку расческой, быструю сортировку и еще одну по варианту. Продемонстрируйте на входных данных работоспособность вашего приложения и корректность реализации алгоритма сортировки.
Реализуйте соответствующий варианту задания генератор входных данных.
Не используйте дополнительные массивы при реализации всех сортировок.
Размер массива выбирайте в диапазоне 20-100 элементов.
Вариант 3. Третья сортировка - сортировка обменом. Входные данные
представлены только отрицательными числами с плавающей точкой
(использовать float).
2
Содержание
Введение................................................................................................................... |
4 |
|
1 ХОД РАБОТЫ ...................................................................................................... |
5 |
|
1.1Описание работы............................................................................................. |
5 |
|
1.2 |
Сортировка расческой ................................................................................... |
6 |
1.2 |
Быстрая сортировка ....................................................................................... |
7 |
1.3 |
Сортировка обменом ..................................................................................... |
7 |
Заключение .............................................................................................................. |
8 |
|
Приложение А ......................................................................................................... |
9 |
|
Приложение Б ........................................................................................................ |
10 |
|
Приложение В........................................................................................................ |
11 |
3
Введение
Целью данной работы является получение навыков работы с разными видами сортировки массивов на языке программирования C# в
среде разработки Visual Studio 2022.
4
1 ХОД РАБОТЫ
1.1Описание работы
Входе данной работе были реализованы три алгоритма сортировки.
Первый алгоритм сортировки – сортировка обменом или пузырьком.
Принцип работы пузырьковой сортировки состоит в том, что сравниваются попарно элементы массива, если элемент слева больше элемента справа, то элементы меняются местами, происходит это до тех пор пока массив не будет отсортирован.
Вторый – алгоритм быстрой сортировки. Быстрая сортировка является существенно улучшенным вариантом алгоритма сортировки с помощью прямого обмена. Принципиальное отличие состоит в том, что в первую очередь производятся перестановки на наибольшем возможном расстоянии и после каждого прохода элементы делятся на две группы .
Третьий - алгоритм сортировки расческой. Сортировка расчѐской улучшает сортировку пузырьком, и конкурирует с алгоритмами, подобными быстрой сортировке. Основная идея — устранить маленькие значения в конце списка, которые крайне замедляют сортировку пузырьком. Таким образом, мы упорядочиваем массив, постепенно распределяя значения в нѐм.
Сначала расстояние между элементами максимально, то есть равно размеру массива минус один. Затем, пройдя массив с этим шагом,
необходимо поделить шаг на фактор уменьшения и пройти по списку вновь.
Так продолжается до тех пор, пока разность индексов не достигнет единицы.
Все три сортировки в худшем случае имеют O(n^2). В лучшем случае сортировка пузырьком имеет O(n), быстрая и сортировка расческой имеют
O(n log(n)). Быстрая сортировка неустойчива в отличие от двух других.
5

1.2Сортировка расческой
Впервом задании реализована сортировка расческой.
На рисунке 1.1 представлен результат работы программы.
Рисунок 1.1 – Результат работы программы
В приложении А представлен листинг программы сортировки расческой.
На рисунке 1.2 представлена блок-схема сортировки расческой.
Рисунок 1.2 – Блок-схема сортировки расческой
6

1.2 Быстрая сортировка
Во втором задании реализована быстрая сортировка.
На рисунке 1.3 представлен результат работы программы.
Рисунок 1.3 – Результат работы программы
Вприложении Б представлен листинг программы быстрой сортировки.
1.3Сортировка обменом
Втретьем задании реализована сортировка обменом.
На рисунке 1.4 представлен результат работы программы.
Рисунок 1.4 – Результат работы программы
В приложении В представлен листинг программы сортировки обменом.
7
Заключение
В ходе выполнения данной практической работы были получены навыки разработки алгоритмов сортировки на языке программирования C#.
Были изучены алгоритмы сортировки расческой, быстрой сортировки и сортировки обменом.
Отчет был написан согласно ОС ТУСУР 01-2021.
8
Приложение А
Сортировка расческой
void FillArray(float[] array, int length) // Функчия заполняет переданный массив array слуцайными цислами типа float.
{
Random r = new Random();
for (int i = 0; i < length; i++)
{
array[i] = r.NextSingle() * (-1);
}
}
// array: массив, который нужно заполнить. //length: длина массива.
void PrintArray(float[] arr, int n) //Пецать массива
{
for (int i = 0; i < n; i++)
{
Console.Write($"{arr[i]} ");
}
Console.WriteLine();
}
//Функчия PrintArray: Эта функчия выводит элементы массива на консоль. //arr: массив, который нужно напецатать.
//n: колицество элементов, которые нужно вывести.
void rascheska(float[] array, int length) //Сортировка массива методом расцески
{
double factor = 1.2473309; // фактор уменьшения
int step = length - 1; //Нацальный шаг сортировки, равный длине массива минус один.
while (step >= 1) // Пока шаг больше или равен 1
{
for (int i = 0; i + step < length; i++)
{
if (array[i] > array[i + step]) // Внутренний чикл сравнивает элементы массива с расстоянием, равным текущему шагу (step). Если элемент больше элемента, находящегося на расстоянии шага, они меняются местами.
{
float temp = array[i]; array[i] = array[i + step]; array[i + step] = temp;
}
}
step = Convert.ToInt32(Math.Floor(step / factor)); // Шаг уменьшается на коэффичиент factor, цто позволяет более эффективно сортировать массив.
}
}
int n = 20;
float[] arr = new float[n]; // Массив arr длиной 20.
FillArray(arr, n); // заполнение массива слуцайными отричательными цислами Console.WriteLine("Несортированный массив");
PrintArray(arr, n); // Вывод неотсортированного массива.
Console.WriteLine(); Console.WriteLine("Отсортированный массив");
rascheska(arr, n); //Сортировка с помощью функчии расцеска PrintArray(arr, n); // Вывод отсортированного массива.
9
Приложение Б Быстрая сортировка
void quickSort(float[] a, int l, int r)
{
float temp;
// i и j используются для обхода массива. int i = l; // i движется вправо
int j = r; // j — влево.
float x = a[(l + r) / 2]; // Опорный элемент (x выбирается как средний элемент подмассива (между индексами l и r))
// Внутренние чиклы ищут элементы, которые нужно обменять: while (i <= j)
{
while (a[i] < x) i++; // Поиск элемента, большего опорного while (a[j] > x) j--; // Поиск элемента, меньшего опорного
if (i <= j) // Если найденные индексы i и j соответствуют условиям (i <= j), элементы меняются местами.
{
if (i <= j)
{
temp = a[i]; a[i] = a[j]; a[j] = temp;
}
i++; j--;
}
}
// После завершения функчия рекурсивно сортирует левую и правую цасти массива. if (i < r)
quickSort(a, i, r); if (l < j)
quickSort(a, l, j);
}
void FillArray(float[] array, int length) // заполнение массива слуцайными цислами
{
Random r = new Random();
for (int i = 0; i < length; i++)
{
array[i] = r.NextSingle() * (-1); // Заполнение отричательными цислами
}
}
void PrintArray(float[] arr, int n) // функчия для вывода на консоль всех элементов массива.
{
for (int i = 0; i < n; i++)
{
Console.Write($"{arr[i]} "); // Вывод элементов массива
}
Console.WriteLine();
}
int n = 20; // Размер массива
float[] arr = new float[n]; // Создание массива FillArray(arr, n); // Заполнение массива
Console.WriteLine("Несортированный массив"); PrintArray(arr, n); // Пецать несортированного массива
Console.WriteLine(); Console.WriteLine("Отсортированный массив"); quickSort(arr, 0, n-1); // Сортировка массива
PrintArray(arr, n); // Пецать отсортированного массива
10