Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2сем / лаб / ЛР-4.docx
Скачиваний:
1
Добавлен:
04.04.2026
Размер:
48 Кб
Скачать
☆

1. Генерация тестовых данных

def generate_array(size):

minNum = 0.0

maxNum = 100.0

return [random.uniform(minNum, maxNum) for _ in range(size)]

  • Создает массив заданного размера со случайными числами от 0.0 до 100.0

  • Используется для подготовки тестовых данных перед каждым запуском сортировки

2. Реализация сортировки пузырьком

def bubble_sort(arr):

operations = 0

n = len(arr)

for i in range(n):

swapped = False

for j in range(0, n-i-1):

operations += 1 # Учет операции сравнения

if arr[j] > arr[j+1]:

arr[j], arr[j+1] = arr[j+1], arr[j]

operations += 3 # Учет 3 операций перестановки

swapped = True

if not swapped:

break

return operations

Особенности:

  • Считает операции сравнения и перестановок

  • Имеет оптимизацию - прекращает работу если массив уже отсортирован

  • Сложность: O(n²) в худшем случае

3. Реализация быстрой сортировки

def quick_sort(arr, operations=[0]):

if len(arr) <= 1:

return arr

pivot = arr[len(arr) // 2]

left = [x for x in arr if x < pivot]

middle = [x for x in arr if x == pivot]

right = [x for x in arr if x > pivot]

operations[0] += len(arr) # Учет сравнений

operations[0] += len(left) + len(right) # Учет операций перемещения

return quick_sort(left, operations) + middle + quick_sort(right, operations)

Особенности:

  • Использует рекурсивный подход "разделяй и властвуй"

  • Считает все операции сравнения и перемещения элементов

  • Сложность: O(n log n) в среднем случае

4. Функция сравнения алгоритмов

def compare_sorting_algorithms(sizes):

# Подготовка массивов для хранения результатов

bubble_times = []

quick_times = []

bubble_ops = []

quick_ops = []

for size in sizes:

arr = generate_array(size)

# Тест пузырьковой сортировки

arr_copy = arr.copy()

start_time = time.time()

ops = bubble_sort(arr_copy)

bubble_times.append(time.time() - start_time)

bubble_ops.append(ops)

# Тест быстрой сортировки

arr_copy = arr.copy()

ops_counter = [0]

start_time = time.time()

quick_sort(arr_copy, ops_counter)

quick_times.append(time.time() - start_time)

quick_ops.append(ops_counter[0])

# Визуализация результатов

# ... (построение графиков)

return bubble_times, quick_times, bubble_ops, quick_ops

Ключевые моменты:

  • Тестирует оба алгоритма на одинаковых данных

  • Измеряет время выполнения и количество операций

  • Для честного сравнения создает копии исходного массива

5. Визуализация результатов

plt.figure(figsize=(12, 5))

# График времени выполнения

plt.subplot(1, 2, 1)

plt.plot(sizes, bubble_times, label='Пузырьком')

plt.plot(sizes, quick_times, label='Быстрая')

# ... настройки графика

# График количества операций

plt.subplot(1, 2, 2)

plt.plot(sizes, bubble_ops, label='Пузырьком')

plt.plot(sizes, quick_ops, label='Быстрая')

# ... настройки графика

plt.tight_layout()

plt.show()

Что показывает:

  • Левый график: время выполнения в секундах

  • Правый график: количество операций

  • Позволяет наглядно сравнить производительность

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