Программа будет сортировать список методом пирамидальной сортировки (Heapsort).

Суть сортировки
- Постройте max-heap из входных данных.
- На данном этапе самый большой элемент хранится в корне кучи. Замените его на последний элемент кучи, а затем уменьшите ее размер на 1. Наконец, преобразуйте полученное дерево в max-heap с новым корнем.
- Повторяйте вышеуказанные шаги, пока размер кучи больше 1.
Сложность сортировки по времени
- Худшая O(n * log n)
- Средняя O(n * log n)
- Лучшая O(n * log n)
Шаги к правильному решению
- Создадим функцию
heapsort, которая принимает на вход список. - Вызовем функцию
build_max_heapc параметромalistдля представления листа в виде пирамиды (heap). - Поменяем местами первый и последний элемент пирамиды.
- Вызовем функцию
max_heapify, учитывая что новая пирамида имеет размер на единицу меньше. Установимindex=0для удовлетворения параметрам пирамиды. - Повторим шаги 3 и 4, пока размер пирамиды не станет 0 и весь список не отсортируется.
- Определим функцию
parent, которая принимаетindexи возвращает индекс родителя. - Определим функцию
left, которая принимаетindexи возвращает индекс левого дочернего элемента. - Определим функцию
right, которая принимаетindexи возвращает индекс правого дочернего элемента. - Определим функцию
build_max_heap, которая принимает список аргументов и переставляет их в соостветсвии сmax heap. build_max_heapвызываетmax_heapifyна каждом родительском ноде и проходит до вершины.- Определим функцию
max_heapify, которая принимает индекс и изменяет структуру пирамиды на ноде и снизу от индекса так, чтобы удовлетворять правилам пирамиды.
def heapsort(alist):
build_max_heap(alist)
for i in range(len(alist) - 1, 0, -1):
alist[0], alist[i] = alist[i], alist[0]
max_heapify(alist, index=0, size=i)
def parent(i):
return (i - 1)//2
def left(i):
return 2*i + 1
def right(i):
return 2*i + 2
def build_max_heap(alist):
length = len(alist)
start = parent(length - 1)
while start >= 0:
max_heapify(alist, index=start, size=length)
start = start - 1
def max_heapify(alist, index, size):
l = left(index)
r = right(index)
if (l < size and alist[l] > alist[index]):
largest = l
else:
largest = index
if (r < size and alist[r] > alist[largest]):
largest = r
if (largest != index):
alist[largest], alist[index] = alist[index], alist[largest]
max_heapify(alist, largest, size)
alist = input('Enter the list of numbers: ').split()
alist = [int(x) for x in alist]
heapsort(alist)
print('Sorted list: ', end='')
print(alist)
