
Болтушкин Л.С., группа 712-2, практика 1
.docx
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОННИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
СОРТИРОВКИ МАССИВОВ
Отчет по практической работе №1
по дисциплине «Структуры данных»
Студент гр. 712-2 ___________ Л.С. Болтушкин ___________
Руководитель Доцент кафедры КИБЭВС
_______ __________ Е.Е. Лунёва
__________
Томск 2023
Задание
Вариант 6. Третья сортировка - сортировка вставками. Входные данные представлены нечетными попеременно отрицательными и положительными числами [-10^6, +10^6].
Сортировка расчёской
Быстрая сортировка
Содержание
Введение. 4
Основная часть. 5
Сортировка вставками. 5
Сортировка расчёской. 6
Быстрая сортировка. 7
Алгоритмическая сложность 8
Заключение. 9
Приложение А 10
Приложение B. 12
Приложение C. 14
Введение
Целью данной работы является изучение видов сортировки массивов и обучение реализовывать сортировку вставками, быструю сортировку и сортировку расчёской. А также, благодаря этой работе мы сможем получить навыки работы с линейной структурой данных.
В данной работе был использован такой язык программирования как
С#.
Основная часть
Сортировка вставками
Сортировка вставками (Insertion Sort) — это простой алгоритм сортировки. Суть его заключается в том, что, на каждом шаге алгоритма мы берем один из элементов массива, находим позицию для вставки и вставляем.
Суть алгоритма: На каждом шаге, начиная с i=1. В последовательности источнике берется один элемент и ставиться в правильную позицию в последовательности приемнике. Количество элементов в последовательности приемнике увеличивается, а в последовательности источнике уменьшается.
Результат работы представлен на рисунке 1.1
Рисунок 1.1 - Результат работы сортировки вставками
В приложении А представлен код программы сортировки вставками.
Рисунок 1.2 - Блок-схема сортировки вставками
Сортировка расчёской
Сортировка расчёской (Comb sort) – алгоритм сортировки массива, является улучшенным вариантом сортировки пузырьком, при этом, по скорости выполнения, конкурирует с алгоритмом быстрой сортировки.
Шаг между сравниваемыми элементами лучше брать с учётом специальной величины, называемой фактором уменьшения, оптимальное значение которой равно примерно 1,247.
Результат работы представлен на рисунке 1.3
Рисунок 1.3 - Результат работы сортировки расчёской
В приложении В представлен код программы сортировки расчёской.
Быстрая сортировка
Широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром во время его работы в МГУ в 1960 году. Один из самых быстрых известных универсальных алгоритмов сортировки массивов (в среднем O (n log n) обменов при упорядочении n элементов).
Общая идея алгоритма состоит в разделении входного набора данных относительно опорного элемента, выбираемого случайным образом. Все элементы, которые меньше опорного перемещаются в нижнюю часть массива, большие остаются на своих местах. В результате выполнения этих действий весь массив должен разделиться на три группы, следующие друг за другом: меньше опорного, равная опорному и больше опорного. Для «больших» и
«меньших» отрезков рекурсивно выполняется та же последовательность действий.
Результат работы представлен на рисунке 1.4
Рисунок 1.4 - Результат работы быстрой сортировки
В приложении С представлен листинг программы быстрой сортировки.
2 Алгоритмическая сложность
Таблица 1 - Алгоритмы
Алгоритм |
Структур а данных |
Временная сложность |
Вспомогательные данные |
||
|
|
Лучшее |
В среднем |
В худшем |
|
Быстрая сортировка |
Массив |
O(n log(n)) |
O(n log(n)) |
O(n^2) |
О(n) |
Сортировка вставками |
Массив |
O(n) |
O(n^2) |
O(n^2) |
О(1) |
Сортировка расчёской |
Массив |
O(n) |
O(n^2/2^p) |
O(n^2) |
О(1) |
Заключение
В данной практической работе были изучены следующие виды сортировки: массивов, расчёской и быстрая. А также получены навыки реализации, все выше упомянутых сортировок, в коде программы и были сравнены в написание кода программы.
Единственное, что вызвало у меня затруднение — это написание кода для сортировки расчёской и вспоминания всей структуры языка программирования C#.
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace сортировка_вставками
{
Приложение А (Сортировка вставками)
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Сортировка вставками"); Console.Write("Сколько элементов в массиве будет : "); int n = Convert.ToInt32(Console.ReadLine());
int[] arr = new int[n]; Random r = new Random(); Random f = new Random(); for (int i = 0; i < n; i++)
{
Console.Write($"Элемент {i + 1}: "); int minus = r.Next(-100000, -1);
int plus = f.Next(1, 100000); arr[i] = minus;
if (i == 0)
{
arr[i] = minus;
}
if (i % 2 == 0)
{
while (minus < 0)
{
if (minus % 2 != 0)
{
arr[i] = minus; break;
}
minus++;
}
}
if (i % 2 != 0)
{
while (plus > 0)
{
if (plus % 2 != 0)
{
arr[i] = plus; break;
}
plus--;
}
}
Console.WriteLine($" {arr[i]}");
}
Console.ReadLine(); for (int t = 0; t < n; t++)
{
int x = arr[t];
int j = t; while (j > 0 && (x < arr[j - 1]))
{
arr[j] = arr[j - 1]; j--;
}
arr[j] = x;
}
Console.WriteLine("Отсортированый массив:"); for (int t = 0; t < n; t++)
{
Console.WriteLine($" {arr[t]}");
}
Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace расческа
{
Приложение Б (Сортировка расческой)
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Сортировка расческой"); Console.Write("Сколько элементов в масиве будет : "); int n = Convert.ToInt32(Console.ReadLine());
int[] arr = new int[n];
Random rand = new Random(); for (int i = 0; i < arr.Length; i++)
{
Console.Write($"Элемент {i + 1}: "); arr[i] = rand.Next(-1000000, 1000000); Console.WriteLine($" {arr[i]}");
}
Console.WriteLine("Отсортированный массив:"); for (int i = 0; i < RSort(arr).Length; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadLine();
}
public static int[] RSort(int[] ch)
{
double step = ch.Length; bool obm = true;
int step1, b;
while (step> 1 || obm)
{
step /= 1.247;
int i = 0;
if (step < 1) { step = 1; } obm = false;
int a = Convert.ToInt32(step); while (i + a < ch.Length)
{
step1= i + a;
if (ch[i] > ch[step1])
{
b = ch[i];
ch[i] = ch[step1]; ch[step1] = b; obm = true;
}
i++;
}
}
return ch;
}
}
Приложение С (Быстрая сортировка)
using System;
class Program
{
static void Main(string[] args)
{
int[] array = GenerateRandomArray(); // Генерируем случайный массив чисел
Console.WriteLine("Исходный массив:");
PrintArray(array);
QuickSort(array, 0, array.Length - 1); // Сортируем массив с помощью быстрой сортировки
Console.WriteLine("Отсортированный массив:");
PrintArray(array);
}
static void QuickSort(int[] array, int low, int high)
{
if (low < high)
{
int pivotIndex = Partition(array, low, high); // Находим опорный элемент
QuickSort(array, low, pivotIndex - 1); // Сортируем элементы меньше опорного
QuickSort(array, pivotIndex + 1, high); // Сортируем элементы больше опорного
}
}
static int Partition(int[] array, int low, int high) // Выполняет разделение массива на части (т.е. больше и меньше около опорного)
{
int pivot = array[high]; // Опорный элемент выбирается как последний элемент в подмассиве
int i = low - 1; // Индекс меньшего элемента
for (int j = low; j < high; j++)
{
if (array[j] < pivot)
{
i++;
Swap(array, i, j); // Если текущий элемент меньше опорного, меняем их местами
}
}
Swap(array, i + 1, high); // Меняем опорный элемент с элементом, стоящим после всех меньших элементов
return i + 1; // Возвращаем индекс опорного элемента
}
static void Swap(int[] array, int i, int j) // Выполняем обмен двух элементов массивов
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
static int[] GenerateRandomArray()
{
Random random = new Random();
int length = random.Next(20, 101); // Генерируем случайную длину массива от 20 до 100
int[] array = new int[length];
for (int i = 0; i < length; i++)
{
array[i] = random.Next(100); // Заполняем массив случайными числами от 0 до 99
}
return array;
}
static void PrintArray(int[] array)
{
foreach (int num in array)
{
Console.Write(num + " ");
}
Console.WriteLine();
}
}