import time
import random
def bubble(a):
a = a[:]
n = len(a)
for i in range(n):
for j in range(n - 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
left = merge(a[:m])
right = merge(a[m:])
res = []
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
res.append(left[i])
i += 1
else:
res.append(right[j])
j += 1
res.extend(left[i:])
res.extend(right[j:])
return res
def timeit(func, a, repeats=3):
times = []
for _ in range(repeats):
start = time.perf_counter()
func(a)
times.append(time.perf_counter() - start)
return sum(times) / repeats
def table(headers, rows):
widths = []
for i in range(len(headers)):
w = len(str(headers[i]))
for row in rows:
if len(str(row[i])) > w:
w = len(str(row[i]))
widths.append(w)
line = "+"
for w in widths:
line += "-" * (w + 2) + "+"
print(line)
header_line = "|"
for i in range(len(headers)):
header_line += " " + str(headers[i]).ljust(widths[i]) + " |"
print(header_line)
print(line.replace("-", "="))
for row in rows:
row_line = "|"
for i in range(len(row)):
row_line += " " + str(row[i]).ljust(widths[i]) + " |"
print(row_line)
print(line)
print("1 - вручную")
print("2 - из файла")
print("3 - случайно")
choice = input("Выбор: ")
if choice == '1':
data = input("Числа через пробел: ")
arr = []
for x in data.split():
arr.append(int(x))
elif choice == '2':
filename = input("Файл: ")
with open(filename) as f:
text = f.read().replace(",", " ")
arr = []
for x in text.split():
arr.append(int(x))
else:
n = int(input("Размер: "))
arr = []
for _ in range(n):
arr.append(random.randint(-1000, 1000))
assert bubble(arr) == merge(arr) == sorted(arr), "Ошибка сортировки!"
tb = timeit(bubble, arr)
tm = timeit(merge, arr)
print()
print("Элементов:", len(arr))
table(
["Алгоритм", "Время (с)", "Сложность"],
[
["Пузырьковая", f"{tb:.6f}", "O(n^2)"],
["Слиянием", f"{tm:.6f}", "O(n log n)"],
]
)
print()
print(f"Слияние быстрее в {tb / tm:.1f} раз(а)")