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

Болтушкин Л.С., группа 712-2, практика 1

.docx
Скачиваний:
1
Добавлен:
04.10.2024
Размер:
120.46 Кб
Скачать

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

Федеральное государственное бюджетное образовательное учреждение высшего образования

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

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

СОРТИРОВКИ МАССИВОВ

Отчет по практической работе №1

по дисциплине «Структуры данных»

Студент гр. 712-2 ___________ Л.С. Болтушкин ___________

Руководитель Доцент кафедры КИБЭВС

_______ __________ Е.Е. Лунёва

__________

Томск 2023

Задание

  1. Вариант 6. Третья сортировка - сортировка вставками. Входные данные представлены нечетными попеременно отрицательными и положительными числами [-10^6, +10^6].

  2. Сортировка расчёской

  3. Быстрая сортировка

Содержание

Введение. 4

  1. Основная часть. 5

    1. Сортировка вставками. 5

    2. Сортировка расчёской. 6

    3. Быстрая сортировка. 7

  2. Алгоритмическая сложность 8

Заключение. 9

Приложение А 10

Приложение B. 12

Приложение C. 14

Введение

Целью данной работы является изучение видов сортировки массивов и обучение реализовывать сортировку вставками, быструю сортировку и сортировку расчёской. А также, благодаря этой работе мы сможем получить навыки работы с линейной структурой данных.

В данной работе был использован такой язык программирования как

С#.

  1. Основная часть

    1. Сортировка вставками

Сортировка вставками (Insertion Sort) — это простой алгоритм сортировки. Суть его заключается в том, что, на каждом шаге алгоритма мы берем один из элементов массива, находим позицию для вставки и вставляем.

Суть алгоритма: На каждом шаге, начиная с i=1. В последовательности источнике берется один элемент и ставиться в правильную позицию в последовательности приемнике. Количество элементов в последовательности приемнике увеличивается, а в последовательности источнике уменьшается.

Результат работы представлен на рисунке 1.1

Рисунок 1.1 - Результат работы сортировки вставками

В приложении А представлен код программы сортировки вставками.

Рисунок 1.2 - Блок-схема сортировки вставками

    1. Сортировка расчёской

Сортировка расчёской (Comb sort) – алгоритм сортировки массива, является улучшенным вариантом сортировки пузырьком, при этом, по скорости выполнения, конкурирует с алгоритмом быстрой сортировки.

Шаг между сравниваемыми элементами лучше брать с учётом специальной величины, называемой фактором уменьшения, оптимальное значение которой равно примерно 1,247.

Результат работы представлен на рисунке 1.3

Рисунок 1.3 - Результат работы сортировки расчёской

В приложении В представлен код программы сортировки расчёской.

    1. Быстрая сортировка

Широко известный алгоритм сортировки, разработанный английским информатиком Чарльзом Хоаром во время его работы в МГУ в 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();

}

}