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

Практическая работа №1

.pdf
Скачиваний:
0
Добавлен:
24.01.2025
Размер:
852.26 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-

вычислительных систем (КИБЭВС)

«Сортировка» Отчет по практической работе №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