Реализации алгоритмов/Сортировка/Пирамидальная: различия между версиями
Содержимое удалено Содержимое добавлено
Нормальное форматирование кода на Паскале; языки следуют в алфавитном порядке |
Переоформлены функции на Python; добавлен пример кода для проверки их работы |
||
Строка 627:
==[[w:Python|Python]]==
Приведённые алгоритмы упорядочивают принимаемую последовательность (список, символьную строку) по неубыванию (''sequence[i] ≤ sequence[i + 1]''). Для упорядочения по невозрастанию (''sequence[i] ≥ sequence[i + 1]'') необходимо заменить все знаки ''<'' на ''> ''в строках, помеченных ''# !''
Для большей эффективности вычислений умножение\деление нацело на 2 производятся операторами побитового сдвига влево (''<<'') и вправо (''>>'') соответственно. Например ''parent << 1'' вместо ''parent * 2'', ''length >> 1'' вместо ''length // 2'' и т. п.
Проверить работу любой из функций можно добавив, например, следующий код (Python3; для Python2 следует опустить скобки в операторах ''print''):
<source lang="python">
count = 30 # Количество значений в последовательности
# Заполняем последовательность значениями, расположенными в порядке, обратном желаемому:
sequence = list(range(count, 0, -1))
# Для упорядочения по невозрастанию закомментируйте предыдущую строку и раскомментируйте следующую
# sequence = list(range(1, count))
print("Исходная последовательность:")
print(sequence)
heap_sort(sequence)
print("Упорядоченная последовательность:")
print(sequence)
</source>
===Вариант № 1===
<source lang="python">
def
def
while
child =
if child
if child + 1 < end and sequence[child] < sequence[child + 1]: # !
child += 1
if
sequence[parent] = sequence[child]
parent = child
break
▲ k = child
for
for
sequence[0], sequence[index] = sequence[index], sequence[0]
li[0] = temp▼
downHeap(li, 0, i)▼
</source>
===Вариант № 2===
<source lang="python">
def
def swap (
if
def
child = (parent + 1) << 1 # То же, что и parent * 2 + 2
if sequence[child] < sequence[child - 1]: # !
▲ swap(pi, gtci)
swap(parent, child)
# heapify▼
parent = child
for i in range((sl/2)-1, -1, -1):▼
# Тело функции heap_sort
for i in range(sl-1, 0, -1):▼
length =
#
sift_down(index, length)
sift_down(0, index)
</source>
|