Львівський Національний університет імені Івана Франка Факультет: електроніки і комп'ютерних технологій КАФЕДРА радіофізики та комп'ютерних технологій Звіт Лабораторна робота Лабораторна робота № 6 Швидке сортування. Порядкові статистики. Виконав: студент групи ФеП-12 Муха Юрій Перевірив: ас. Левуш П.Н. Львів-2023 Теоретичні відомості (Лекція_8 Швидке сортування. Порядкові статистики.pdf) Хід роботи: Частина 1. Швидке сортування. 1. У бібліотеці Sort (створеній раніше), згідно описаних в теоретичній частині алгоритмів, створити функції QuickSort(…), Partition(…) та RandomizedPartition(…) для реалізації швидкого сортування одномірного масиву даних. 2. Створити новий проект Lab_6_1 та підключити до нього бібліотеку Sort. У функції main() проекту реалізувати можливість введення одномірного масиву даних та відображення результатів сортування. Відкомпілювати проект та продемонструвати його роботу для одномірного масиву даних, отриманого від викладача. Частина 2. Порядкові статистики. 1. Створити новий проект Lab_6_2. Згідно описаного в теоретичній частині алгоритму, створити функцію RandomizedSelect(…) для пошуку функції main() порядкових статистик. У проекту реалізувати можливість введення одномірного масиву даних та відображення результатів пошуку порядкових статистик у ньому. 2. Підключити до проекту Lab_6_2 бібліотеку Sort з метою використання функції RandomizedPartition(…). 3. Відкомпілювати проект та продемонструвати його роботу для одномірного масиву даних, отриманого від викладача, зокрема, знайти максимальне, мінімальне значення та медіану. Частина 1. Швидке сортування. 1.У бібліотеці Sort (створеній раніше), згідно описаних в теоретичній частині алгоритмів, створити функції QuickSort(…), Partition(…) та RandomizedPartition(…) для реалізації швидкого сортування одномірного масиву даних. 2. Створити новий проект Lab_6_1 та підключити до нього бібліотеку Sort. У функції main() проекту реалізувати можливість введення одномірного масиву даних та відображення результатів сортування. Відкомпілювати проект та продемонструвати його роботу для одномірного масиву даних, отриманого від викладача. main.py from Sort import QuickSort if __name__ == "__main__": arr = [12, 4, 5, 6, 7, 3, 1, 15] sorted_arr = QuickSort(arr) print("Відсортований масив:", sorted_arr) Sort.py def QuickSort(arr): if len(arr) <= 1: return arr else: pivot = arr[0] less = [x for x in arr[1:] if x <= pivot] greater = [x for x in arr[1:] if x > pivot] return QuickSort(less) + [pivot] + QuickSort(greater) def Partition(arr, low, high): pivot = arr[low] left = low + 1 right = high done = False while not done: while left <= right and arr[left] <= pivot: left = left + 1 while arr[right] >= pivot and right >= left: right = right - 1 if right < left: done = True else: arr[left], arr[right] = arr[right], arr[left] arr[low], arr[right] = arr[right], arr[low] return right def RandomizedPartition(arr, low, high): # Додайте код для випадкового вибору опорного елемента # Ви можете використовувати модуль random для цього. pass Частина 2. Порядкові статистики. 1.Створити новий проект Lab_6_2. Згідно описаного в теоретичній частині алгоритму, створити функцію RandomizedSelect(…) для пошуку порядкових функції main() статистик. У проекту реалізувати можливість введення одномірного масиву даних та відображення результатів пошуку порядкових статистик у ньому. 2.Підключити до проекту Lab_6_2 бібліотеку Sort з метою використання функції RandomizedPartition(…). 3.Відкомпілювати проект та продемонструвати його роботу для одномірного масиву даних, отриманого від викладача, зокрема, знайти максимальне, мінімальне значення та медіану. main.py from Sort import RandomizedSelect if __name__ == "__main__": arr = [12, 4, 5, 6, 7, 3, 1, 15] min_val = RandomizedSelect(arr, 0, len(arr) - 1, 1) max_val = RandomizedSelect(arr, 0, len(arr) - 1, len(arr)) median = RandomizedSelect(arr, 0, len(arr) - 1, len(arr) // 2 + 1) print("Мінімальне значення:", min_val) print("Максимальне значення:", max_val) print("Медіана:", median) Sort.py import random # Додайте цей імпорт для генерації випадкового опорного елемента def RandomizedPartition(arr, low, high): # Виберіть випадковий опорний елемент random_index = random.randint(low, high) arr[low], arr[random_index] = arr[random_index], arr[low] pivot = arr[low] left = low + 1 right = high done = False while not done: while left <= right and arr[left] <= pivot: left = left + 1 while arr[right] >= pivot and right >= left: right = right - 1 if right < left: done = True else: arr[left], arr[right] = arr[right], arr[left] arr[low], arr[right] = arr[right], arr[low] return right def RandomizedSelect(arr, low, high, k): if low == high: return arr[low] pivot_index = RandomizedPartition(arr, low, high) pivot_rank = pivot_index - low + 1 if k == pivot_rank: return arr[pivot_index] elif k < pivot_rank: return RandomizedSelect(arr, low, pivot_index - 1, k) else: return RandomizedSelect(arr, pivot_index + 1, high, k - pivot_rank)