Практики(Вариант №1) / Практическая работа №1
.odtМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра безопасности информационных систем (БИС)
СОРТИРОВКИ МАССИВОВ Отчет по практической работе №1 по дисциплине «Структуры данных»
Студент гр.
________
__.__.2025
Принял
Преподаватель
кафедры КИБЭВС
________ Е.Е. Лунева
__.__.2025
Задание
Реализовать сортировку расческой, быструю сортировку и еще одну по варианту. Продемонстрировать на входных данных работоспособность приложения и корректность реализации алгоритма сортировки. Реализовать соответствующее варианту задание генератор входных данных. Не использовать дополнительных массивов при реализации всех сортировок. Размер массива выбрать в диапазоне 20-100 элементов.
Вариант 1. Третья сортировка - это сортировка выбором. Входные данные представлены только отрицательными целыми числами , минимальное число не меньше чем -10^6.
Оглавление
Задание 2
Введение 4
Целью данной работы является изучение и практическая реализация различных алгоритмов сортировки, таких как сортировка расческой, быстрая сортировка и сортировка выбором, на языке программирования C#. 4
1 ХОД РАБОТЫ 5
1.1 Сортировка расческой 5
1.2 Быстрая сортировка 6
1.3 Сортировка выбором 6
2 АЛГОРИТМИЧЕСКАЯ СЛОЖНОСТЬ 9
Приложение А 10
Приложение Б 11
Приложение В 13
Введение
Целью данной работы является изучение и практическая реализация различных алгоритмов сортировки, таких как сортировка расческой, быстрая сортировка и сортировка выбором, на языке программирования C#.
1 ХОД РАБОТЫ
1.1 Сортировка расческой
Сортировка расческой — это улучшенная версия пузырьковой сортировки. Вместо того, чтобы сравнивать только соседние элементы, этот алгоритм начинает с большого шага между элементами, который постепенно уменьшается. Шаг сравнения изначально большой, а затем уменьшается до 1 (как при пузырьковой сортировке). Это помогает быстрее перемещать большие и маленькие элементы к их правильным местам.
Шаг между сравниваемыми элементами лучше брать с учётом специальной величины, называемой фактором уменьшения, оптимальное значение которой равно примерно 1,247.
На рисунке 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^2) |
O(n^2) |
O(n^2) |
Приложение А
(Обязательное)
Сортировка расческой
using System;
class Program
{
static void FillArray(float[] array, int length)
{
Random r = new Random();
for (int i = 0; i < length; i++)
{
array[i] = r.NextSingle() * (-1);
}
}
static void PrintArray(float[] arr, int n)
{
for (int i = 0; i < n; i++)
{
Console.Write($"{arr[i]} ");
}
Console.WriteLine();
}
static void rascheska(float[] array, int length)
{
double factor = 1.2473309;
int step = length - 1;
while (step >= 1)
{
for (int i = 0; i + step < length; i++)
{
if (array[i] > array[i + step])
{
float temp = array[i];
array[i] = array[i + step];
array[i + step] = temp;
}
}
step = Convert.ToInt32(Math.Floor(step / factor));
}
}
static void Main()
{
int n = 20;
float[] arr = new float[n];
FillArray(arr, n);
Console.WriteLine("Несортированный массив");
PrintArray(arr, n);
Console.WriteLine();
Console.WriteLine("Отсортированный массив");
rascheska(arr, n);
PrintArray(arr, n);
}
}
Приложение Б
(Обязательное)
Быстрая сортировка
void quickSort(float[] a, int l, int r)
{
float temp;
int i = l;
int j = r;
float x = a[(l + r) / 2];
while (i <= j)
{
while (a[i] < x) i++;
while (a[j] > x) 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);
Приложение В
(Обязательное)
Сортировка выбором
using System;
class Program
{
static void Main()
{
int[] numbers = new int[25];
Random random = new Random();
for (int i = 0; i < numbers.Length; i++)
{
numbers[i] = random.Next(-1000000, -1);
}
Console.WriteLine("\nНеотсортированный массив:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
SelectionSort(numbers);
Console.WriteLine("\n\nОтсортированный массив:");
for (int i = 0; i < numbers.Length; i++)
{
Console.Write(numbers[i] + " ");
}
}
static void SelectionSort(int[] arr)
{
for (int i = 0; i < arr.Length - 1; i++)
{
int minIndex = i;
for (int j = i + 1; j < arr.Length; j++)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
if (minIndex != i)
{
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
}
