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

2сем / лаб пдф / ВвИТ_2сем24_ЛР4

.pdf
Скачиваний:
0
Добавлен:
04.04.2026
Размер:
83.38 Кб
Скачать

Лабораторная работа №4

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

Технические требования:

Среда разработки для написания кода на Python Компилятор Python 3 (+ стандартный набор библиотек)

Требования к знаниям студентов:

Основы синтаксиса Python 3:

-умение работать с переменными и знание типов данных

-умение работать со списками

-умение считывать данные из файла

-умение выводить данные в консоль/файл

-знание условных конструкций if-elif-else

-умение писать циклы for/while

-умение создавать и вызывать функции, возращать значения

-умение генерировать случайные числа

Цель работы:

Знакомство с численными методами для решения задач:

-сортировка элементов массива

-поиск элементов в упорядоченном массиве

Теоретическое введение:

Блок 1 “Алгоритмы сортировки и поиска”

Рассмотрим задачу по поиску элемента в неупорядоченном наборе чисел (массиве). Решение будем производить в 2 этапа: упорядочим (т.е. расположим по порядку – по возрастанию) элементы массива, а затем найдем нужное в упорядоченном наборе. Рассмотрим два популярных алгоритма сортировки: осортировку пузырьком и быструю сортировку.

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

Алгоритм:

1.Начинаем с первого элемента и сравниваем его со следующим элементом.

2.Если первый элемент больше второго, меняем их местами.

3.Продолжаем сравнивать следующий элемент с последующим и так далее до конца списка.

4.После одного полного прохода самый большой элемент окажется на своем месте (в конце списка).

5.Повторяем процесс для оставшихся элементов, исключая уже отсортированные.

6.Процесс повторяется до тех пор, пока весь массив не станет отсортированным.

Преимуществом метода является простота реализации, в то время как существенным недостатком является медленная работа на больших наборах данных из-за квадратичной сложности алгоритма (предлагается самостоятельно изучить сложности алгоритмов и оценить сортировку пузырьком как один из методов обработки массива данных).

Быстрая сортировка (QuickSort) — это эффективный рекурсивный алгоритм сортировки, основанный на принципе "разделяй и властвуй”. Алгоритм выбирает один элемент (опорный) и разбивает массив на две части: элементы меньше опорного и элементы больше опорного. Затем этот процесс применяется рекурсивно к обеим частям.

Алгоритм:

1.Выбираем опорный элемент (обычно последний элемент).

2.Разделяем массив на две части: элементы меньшие опорного и большие опорного.

3.Рекурсивно применяем быструю сортировку к каждой из частей.

4.Когда размеры подмассивов становятся равными единице, массив считается отсортированным.

Преимуществом метода является высокая эффективность на практике благодаря своей средней сложности O(n*log(n)). К недостаткам можно отнести требование дополнительной памяти для стека рекурсии.

Сравнивая эти методы между собой, можно отметить, что хотя сортировка пузырьком проще в реализации, она менее эффективна на больших объемах данных. Быстрая сортировка же является одним из наиболее эффективных методов сортировки и широко используется на практике.

Теперь вернемся к исходной задаче по поиску элемента в неупорядоченном массиве. После того, как мы упорядочили массив, можно воспользоваться бинарным поиском для нахождения искомого элемента. По своей логической структуре этот метод похож на дихотомию, которую мы изучали в разделе поиска корней уравнения на отрезке. Он работает по принципу деления массива пополам на каждом шаге, что позволяет значительно сократить количество проверок: каждую итерацию мы сравниваем средний элемент диапазона с искомым и берем либо большую (в случае, если средний элемент меньше искомого), либо меньшую (если средний элемент больше искомого) половину для следующей итерации.

Практическая часть

Задание 1.1 (основная часть) “Реализация алгоритма сортировки и поиска элемента в массиве”

Задание состоит из 2 подзадач: отсортировать элементы в неупорядоченном массиве и найти в отсортированном массиве загаданный элемент (его наличие в исходном массиве гарантируется).

Для получения исходного (неупорядоченного) массива стоит добавить следующий код в начало программы:

import random arr = [] minNum = 0.0 maxNum = 100.0 N = 10000

for _ in range (N): arr.append(random.uniform(minNum, maxNum))

arrCopy = arr

x = arr[random.randint(0,N-1)]

Теперь в переменной arr находитсяя список из N неупорядочнных элементов из диапазона [minNum, maxNum], а в переменной x – загаданное число, которое нужно будет найти. В переменной arrCopy хранится копия списка arr, ее изменять не нужно, она понадобится для проверки работоспособности кода в конце.

Задача 1: необходимо создать список arrSort, состоящий из упорядоченных (расположенных в порядке неубывания) элементов массива arr. Алгоритм сортировки (сортировка пузырьком или быстрая сортировка) выбирает преподаватель исходя из уровня подготовки и заинтересованности обучающегося.

Задача 2: необходимо в массиве arrSort с помощью бинарного поиска найти элемент со значением x и в меременную idx записать порядковый номер (начиная с 0) этого элемента в списке arrSort.

Для проверки следует добавить следующий код в конец своей программы (в случае, если все будет сделано правильно, в конце появится сообщение “Good”)

# insertion sort algorythm def insSort(nums):

for i in range(1, len(nums)): item_to_insert = nums[i] j = i - 1

while j >= 0 and nums[j] > item_to_insert: nums[j + 1] = nums[j]

j -= 1

nums[j + 1] = item_to_insert

insSort(arrCopy)

if arrSort == arrCopy and arrSort[idx] == x: print("Good")

else:

print("Bad")

Задание 1.2 (дополнительная часть) “Сравнение эффективности алгоритмов сортировки”

В качестве альтернативы заданию 1.1 может быть его усложненная версия - предлагается выполнить задание 1.1 двумя способами (упорядочивая массив с помощью метода сортировки пузырьком и с помощью быстрой сортировки), а также сравнить эффективность двух методов. Критерий эффективность учащийся может выбрать самостоятельно, в качестве примеров могут выступать количество обращений к массиву/ элементам, время работы и т.д.

Заключение:

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

При сдаче работы студент должен знать изученные численные методы, а также разбираться в коде написанной программы.

Соседние файлы в папке лаб пдф