Загрузка данных
import random
import time
def bubble_sort(arr):
a = arr.copy()
swaps = 0
n = len(a)
for i in range(n):
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swaps += 1
return a, swaps
def insertion_sort(arr):
a = arr.copy()
swaps = 0
for i in range(1, len(a)):
key = a[i]
j = i - 1
while j >= 0 and a[j] > key:
a[j + 1] = a[j]
swaps += 1
j -= 1
a[j + 1] = key
return a, swaps
def selection_sort(arr):
a = arr.copy()
swaps = 0
n = len(a)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if a[j] < a[min_idx]:
min_idx = j
if min_idx != i:
a[i], a[min_idx] = a[min_idx], a[i]
swaps += 1
return a, swaps
def quick_sort(arr):
a = arr.copy()
swaps = [0]
def _quick(lo, hi):
if lo < hi:
pivot = a[hi]
i = lo - 1
for j in range(lo, hi):
if a[j] <= pivot:
i += 1
if i != j:
a[i], a[j] = a[j], a[i]
swaps[0] += 1
a[i + 1], a[hi] = a[hi], a[i + 1]
swaps[0] += 1
p = i + 1
_quick(lo, p - 1)
_quick(p + 1, hi)
_quick(0, len(a) - 1)
return a, swaps[0]
def merge_sort(arr):
a = arr.copy()
swaps = [0]
def _merge(lo, hi):
if hi - lo <= 1:
return
mid = (lo + hi) // 2
_merge(lo, mid)
_merge(mid, hi)
left = a[lo:mid]
right = a[mid:hi]
i = j = 0
k = lo
while i < len(left) and j < len(right):
if left[i] <= right[j]:
a[k] = left[i]
i += 1
else:
a[k] = right[j]
j += 1
swaps[0] += 1
k += 1
while i < len(left):
a[k] = left[i]
i += 1
k += 1
while j < len(right):
a[k] = right[j]
j += 1
k += 1
_merge(0, len(a))
return a, swaps[0]
def shaker_sort(arr):
a = arr.copy()
swaps = 0
left = 0
right = len(a) - 1
while left < right:
for i in range(left, right):
if a[i] > a[i + 1]:
a[i], a[i + 1] = a[i + 1], a[i]
swaps += 1
right -= 1
for i in range(right, left, -1):
if a[i - 1] > a[i]:
a[i - 1], a[i] = a[i], a[i - 1]
swaps += 1
left += 1
return a, swaps
def main():
n = int(input("Введите размер массива: "))
arr = [random.randint(0, 1000) for _ in range(n)]
print("Исходный массив:", arr)
algorithms = [
("Пузырьковая", bubble_sort),
("Вставками", insertion_sort),
("Выбором", selection_sort),
("Быстрая", quick_sort),
("Слиянием", merge_sort),
("Шейкерная", shaker_sort),
]
print("\n{:<15} {:<15} {:<15}".format("Алгоритм", "Время (сек)", "Перестановки"))
print("-" * 45)
for name, func in algorithms:
start = time.perf_counter()
sorted_arr, swaps = func(arr)
elapsed = time.perf_counter() - start
print("{:<15} {:<15.6f} {:<15}".format(name, elapsed, swaps))
print("\nОтсортированный массив:", sorted_arr)
if __name__ == "__main__":
main()