import time
import random
def bubble(a):
a = a[:]
for i in range(len(a)):
for j in range(len(a) - i - 1):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
return a
def merge(a):
if len(a) <= 1:
return a
m = len(a) // 2
l, r = merge(a[:m]), merge(a[m:])
res, i, j = [], 0, 0
while i < len(l) and j < len(r):
if l[i] <= r[j]:
res.append(l[i]); i += 1
else:
res.append(r[j]); j += 1
return res + l[i:] + r[j:]
def timeit(f, a, n=3):
t = []
for _ in range(n):
s = time.perf_counter()
f(a)
t.append(time.perf_counter() - s)
return sum(t) / n
def table(headers, rows):
w = [max(len(str(h)), *(len(str(r[i])) for r in rows)) for i, h in enumerate(headers)]
line = '+' + '+'.join('-' * (x + 2) for x in w) + '+'
fmt = lambda r: '|' + '|'.join(f' {str(c):<{w[i]}} ' for i, c in enumerate(r)) + '|'
print(line)
print(fmt(headers))
print(line.replace('-', '='))
for r in rows:
print(fmt(r))
print(line)
# --- ввод ---
print("1 - вручную, 2 - из файла, 3 - случайно")
c = input("Выбор: ")
if c == '1':
a = [int(x) for x in input("Числа через пробел: ").split()]
elif c == '2':
a = [int(x) for x in open(input("Файл: ")).read().replace(',', ' ').split()]
else:
a = [random.randint(-1000, 1000) for _ in range(int(input("Размер: ")))]
# --- проверка и замер ---
assert bubble(a) == merge(a) == sorted(a), "Ошибка сортировки!"
tb, tm = timeit(bubble, a), timeit(merge, a)
# --- вывод ---
print(f"\nЭлементов: {len(a)}")
table(
["Алгоритм", "Время (с)", "Сложность"],
[
["Пузырьковая", f"{tb:.6f}", "O(n^2)"],
["Слиянием", f"{tm:.6f}", "O(n log n)"],
]
)
print(f"\nСлияние быстрее в {tb / tm:.1f} раз(а)")