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

Практика 1 - Сортировки массивов - СФ

.pdf
Скачиваний:
7
Добавлен:
06.11.2022
Размер:
377.25 Кб
Скачать

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

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

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

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

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

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

Студент гр. ххххх

________ ххххх

________

Принял Преподаватель КИБЭВС

________ ххххх

________

Томск 2022

Содержание

1 Введение ……………………………………………………………………….. 3

2 Ход работы …………………………………………………………………….. 4

2.1Сортировка «расческой» ……………………………………………… 4

2.2Быстрая сортировка ………………………...…………………………. 6

2.3Сортировка Шелла ...………………………………………………….. 6 3 Алгоритмическая сложность ………………………………………………..… 8

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

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

Приложение Б …………………………………………………………………... 11

Приложение В …………………………………………………………………... 13

2

1 Введение

Целью данной практической работы является получение навыка работы с сортировками. Будут изучены сортировка «расческой», быстрая сортировка и сортировка Шелла. Для разработки сортировок будет использован язык программирования C#.

3

2 Ход работы

Будет реализовано 3 сортировки: сортировка «расческой», быстрая сортировка и сортировка Шелла. Также дополнительным условием варианта было то, что входные данные представлены только числами двоичной точности с плавающей точкой.

2.1 Сортировка «расческой»

Сортировка «расческой» является усовершенствованным вариантом сортировки «пузырьком». Идея этой сортировки заключается в том, что элементы будут сравниваться через определенный шаг. Шаг будет постепенно уменьшаться, благодаря фактору уменьшения. Он высчитывается по формуле

2.1 и равен 1.247:

1

= 1,247

(2.1)

1−

где – золотое сечение или золотое число;

е – экспонента, равна 2.718.

На последней итерации цикла шаг будет равен одному и это эквивалентно одному проходу сортировки пузырьком.

На рисунке 2.1 представлена блок-схема данной сортировки, на рисунке

2.2 представлена работа конструкции Try-Catch - это конструкция обрабатывает вводимые данные и если они не верны, то выводит предупреждение на экран. Эта конструкция реализована во всех последующих алгоритмах. И также на рисунке 2.3 представлен результат работы программы.

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

«расческой».

4

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

Рисунок 2.2 - Работа конструкции Try-Catch

Рисунок 2.3 - Результат работы программы

5

2.2 Быстрая сортировка

Общая идея этой сортировки заключается в том, чтобы разделить входной набор данных относительно опорного элемента. Все элементы,

которые меньше опорного перемещаются в нижнюю часть массива, большие остаются на своих местах. В результате выполнения этих действий весь массив должен разделиться на три группы, следующие друг за другом: меньше опорного, равная опорному и больше опорного. Для «больших» и «меньших» отрезков рекурсивно выполняется та же последовательность действий.

Опорный элемент выбирается на каждой итерации. Сортировка реализована рекурсией.

Реализация алгоритма быстрой сортировки была осуществлена с помощью рекурсии, опорный элемент выбирался на каждой итерации по методу разбиения Хоара, где берется сумма первого элемента последовательности и последнего, и делится на два.

На рисунке 2.4 представлен результат работы программы.

Рисунок 2.4 - Результат работы быстрой сортировки В приложении Б представлен листинг программы быстрой сортировки.

2.3 Сортировка Шелла

Является усовершенствованным вариантом сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и

6

на определённом расстоянии друг от друга. Элементы сравниваются через определенный шаг.

На первой итерации шаг равен половине длины массива, т.е.

сравниваются первый и последний элементы массива. Затем шаг уменьшается в два раза, пока не станет равным нулю. Когда шаг будет равен единице, это будет эквивалентно одному проходу сортировки вставками.

На рисунке 2.5 представлен результат работы программы.

Рисунок 2.5 - Результат работы сортировки Шелла В приложении В представлен листинг программы сортировки Шелла.

7

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

Все три сортировки в худшем случае имеют O(n^2). Но в лучшем случае быстрая сортировка и сортировка «расческой» имеют одинаковую временную сложность, она равна O(n log n), но сортировка Шелла в лучшем случае имеет временную сложность O (N lg N) соответственно, также она неустойчива к одинаковым элементам. Следовательно сортировка Шелла – самая худшая из трех представленных сортировок.

8

Заключение

В ходе выполнения данной практической работы были получены навыки разработки алгоритмов сортировки на языке программирования C#. Были изучены алгоритм сортировки «расческой», алгоритм быстрой сортировки, а

также алгоритм сортировки Шелла.

Наиболее затруднительным был алгоритм быстрой сортировки.

9

Приложение А

(обязательное)

Сортировка «расческой»

using System;

namespace StructureOfData1

{

class Program

{

static void Main(string[] args)

{

try

{

Console.Write("Введите количество чисел в массиве (Сортировка 'расческой'): ");

int n = int.Parse(Console.ReadLine()); Random rand = new Random();

double[] arr = new double[n]; for (int i = 0; i <= n-1; i++)

{

arr[i] = rand.NextDouble(); arr[i] *= 100;

while (arr[i] / 10 < 1)

{

arr[i] = rand.NextDouble(); arr[i] *= 100;

}

}

Console.WriteLine("Массив : ");

foreach (double d in arr) Console.Write(d + " "); int step = n - 1;

while (step >= 1)

{

for (int i = 0; i + step < n ; i++)

{

if (arr[i] > arr[i + step])

{

double temp = arr[i]; arr[i] = arr[i + step]; arr[i + step] = temp;

}

}

step = Convert.ToInt32(Math.Floor(step / 1.247));

}

Console.WriteLine(); Console.WriteLine("Отсортированный массив: "); foreach (double d in arr) Console.Write(d + " ");

}

catch (System.FormatException)

{

Console.WriteLine("Неверно введены данные!!!"); Main(args);

}

catch (System.OverflowException)

{

Console.WriteLine("Число слишком большое или слишком маленькое!!!"); Main(args);

}

}

}

}

10