Лабораторная работа асд. Лабораторные работы_по_АСД. Дисциплина Алгоритмы и структуры данных Отчёт по лабораторной работе
![]()
|
Лабораторная работа №8. Рекурсия. Алгоритм быстрой сортировки. Алгоритм сортировки слияниемЗадание Используя рекурсию, составить блок-схемы алгоритмов решения задач, их реализацию в виде программы на языке программирования и скрин экрана с результатом работы программы. Выполнить анализ работы алгоритмов при задании различных вариантов исходных данных и описать возможные ограничения по входным данным. Составить отчёт по выполненной лабораторной работе. Решение Задача 1. Дан одномерный массив. Отсортировать его методом Хоара по неубыванию, используя рекурсию. Все используемые идентификаторы представлены в таблице 50 Таблица 50 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 99. ![]() Рисунок 98. Блок схема алгоритма для задачи 1 Программа на C#: using System; namespace lr8_z1 { class Program { static void Main(string[] args) { void HoareSort(int[] a, int start, int end) { int temp; if (start >= end) return; int sep = start; for (int i = start; i <= end; i++) { if (a[i] < a[end]) { temp = a[sep]; a[sep] = a[i]; a[i] = temp; sep++; } } temp = a[sep]; a[sep] = a[end]; a[end] = temp; HoareSort(a, start, sep - 1); HoareSort(a, sep + 1, end); } Console.Write("Введите количество элементов массива: "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив:"); int[] A = new int[n]; for (int i = 0; i < n; i++) A[i] = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(); HoareSort(A, 0, n - 1); Console.WriteLine("После сортировки Хоара по неубыванию:"); for (int i = 0; i < n; i++) Console.Write(A[i] + " "); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 100. ![]() ![]() Рисунок 99. Скриншот результата работы программы задачи 1. Задача 2. Сформировать из двух одномерных массивов третий, используя метод слияния. Все используемые идентификаторы представлены в таблице 51 Таблица 51 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 101. ![]() Рисунок 100. Блок схема алгоритма решения задачи 2 Программа на C#: using System; namespace lr8_z2 { class Program { static void Main(string[] args) { int[] Merge(int[] a, int[] b) { int x = 0, y = 0; int[] c = new int[a.Length + b.Length]; for (int i = 0; i < a.Length + b.Length; i++) { if (y < b.Length && x < a.Length) { if (a[x] > b[y]) c[i] = b[y++]; else c[i] = a[x++]; } else { if (y < b.Length) c[i] = b[y++]; else c[i] = a[x++]; } } return c; } Console.Write("Введите количество элементов массива 1: "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив 1:"); int[] A = new int[n]; for (int i = 0; i < n; i++) A[i] = Convert.ToInt32(Console.ReadLine()); Console.Write("Введите количество элементов массива 2: "); int m = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив 2:"); int[] B = new int[m]; for (int i = 0; i < m; i++) B[i] = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(""); int[] C = new int[n + m]; C = Merge(A, B); Console.WriteLine("Полученный массив:"); for (int i = 0; i < n + m ; i++) { Console.Write(C[i] + " "); } Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 102. ![]() Рисунок 101. Скриншот результата работы программы задачи 2. Задача 3. Отсортировать одномерный массив методом слияния, используя рекурсию. Все используемые идентификаторы представлены в таблице 52 Таблица 52 – Идентификаторы
Блок схема алгоритма решения задачи представлена на рисунке 103. ![]() Рисунок 102. Блок схема алгоритма решения задачи 3 Программа на C#: using System; namespace lr8_z3 { class Program { static void Main(string[] args) { int[] Merge(int[] a, int[] b) { int x = 0, y = 0; int[] c = new int[a.Length + b.Length]; for (int i = 0; i < a.Length + b.Length; i++) { if (y < b.Length && x < a.Length) { if (a[x] > b[y]) c[i] = b[y++]; else c[i] = a[x++]; } else { if (y < b.Length) c[i] = b[y++]; else c[i] = a[x++]; } } return c; } int[] MergeSort(int[] m) { if (m.Length == 1) return m; int sep = m.Length / 2; int[] a = new int[sep]; int[] b = new int[m.Length - sep]; for (int i = 0; i < m.Length; i++) { if (i < sep) a[i] = m[i]; else b[i - sep] = m[i]; } return Merge(MergeSort(a), MergeSort(b)); } Console.Write("Введите количество элементов массива: "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Введите массив:"); int[] A = new int[n]; for (int i = 0; i < n; i++) A[i] = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(""); int[] C = new int[n]; C = MergeSort(A); Console.WriteLine("После сортировки методом слияния:"); for (int i = 0; i < n; i++) Console.Write(C[i] + " "); Console.ReadKey(); } } } Скриншот результата работы программы представлен на рисунке 104. ![]() ![]() Рисунок 103. Скриншот результата работы программы задачи 3. |