Реализации алгоритмов/Сортировка/Пирамидальная: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 704:
 
==Rust==
Приведённые алгоритмы упорядочивают принимаемую последовательность ''sequence'' (в её качестве могут выступать массив (array), вектор (Vec), срез (slice)) по неубыванию (''sequence[i] ≤ sequence[i + 1]''). Для упорядочения по невозрастанию (''sequence[i] ≥ sequence[i + 1]'') необходимо заменить '''все'''закомментировать знаки <code><</code> наи раскомментировать <code>></code> в строкахместах, помеченных <code>/*>*/ !</code>
 
Для большей эффективности вычислений умножение и деление нацело на 2 производятся операторами побитового сдвига влево (<code><<</code>) и вправо (<code>>></code>) соответственно. Например <code>parent << 1</code> вместо <code>parent * 2</code>, <code>length >> 1</code> вместо <code>length / 2</code> и т. п.
Строка 740:
let right = left + 1; // Индекс правого ребёнка
if right < length { // Если существуют оба ребёнка
if sequence[left] < /*>*/ sequence[index + offset] || sequence[right] < /*>*/ sequence[index + offset] { // !
if sequence[left] < /*>*/ sequence[right] { // !
sequence.swap(index + offset, left);
flag = true;
} else if sequence[right] < /*>*/ sequence[left] { // !
sequence.swap(index + offset, right);
flag = true;
Строка 751:
// Дополнительная проверка для последних двух элементов;
// с её помощью можно отсортировать пирамиду состоящую всего лишь из трёх элементов
if sequence[right] < /*>*/ sequence[left] { // !
sequence.swap(left, right);
flag = true;
}
} else if left < length { // Если существует только один ребёнок
if sequence[left] < /*>*/ sequence[index + offset] { // !
sequence.swap(index + offset, left);
flag = true;
Строка 768:
}
offset + 2 < length // Условие повторения цикла while
} { /* Пустое тело цикла (имитация цикла с постусловием)*/ }
} { }
}
</source>
Строка 784:
child < limit // Условие повторения № 1: у sequence[parent] есть хоть один ребёнок
} && {
// Выбор большего /*меньшего*/ из детей sequence[parent]
if child + 1 < limit && sequence[child] < /*>*/ sequence[child + 1] {
child += 1;
};
item < /*>*/ sequence[child] // Условие повторения № 2: item меньше наибольшего /*больше наименьшего*/ из детей sequence[parent]
} { // Тело цикла
sequence[parent] = sequence[child]; // Сдвигаем ребёнка на место его родителя