Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
pi = gtci
# heapify
for i in range((sl/2)-1, -1, -1):
Sift(i, sl)
# sort
for i in range(sl-1, 0, -1):
Swap(i, 0)
Sift(0, i)
static void HeapSort(int[] a)
{
Int i;
Int temp;
for (i = (a.Length / 2) - 1; i >= 0; i--)
{
SiftDown(a, i, a.Length);
}
for (i = a.Length - 1; i >= 1; i--)
{
temp = a[0];
a[0] = a[i];
a[i] = temp;
SiftDown(a, 0, i - 1);
}
}
static void siftDown(int[] a, int i, int j)
{
bool done = false;
Int maxChild;
Int temp;
while ((i * 2 < j) && (!done))
{
if (i * 2 == j)
maxChild = i * 2;
else if (a[i * 2] > a[i * 2 + 1])
maxChild = i * 2;
Else
maxChild = i * 2 + 1;
if (a[i] < a[maxChild])
{
temp = a[i];
a[i] = a[maxChild];
a[maxChild] = temp;
i = maxChild;
}
Else
{
done = true;
}
}
}
Идея алгоритма
Для того, чтобы прояснить всё дальнейшее изложение, в двух словах опишу идею алгоритма.
Пирамида — двоичное дерево, в котором значение каждого элемента больше либо равно значений дочерних элементов.
Заполнив дерево элементами в произвольном порядке, можно легко его отсортировать (легче, чем исходный список элементов), превратив в пирамиду.
Самый большой элемент пирамиды находится в её вершине.
Отделяем вершинный элемент, и записываем его в конец результирующего массива.
На место вершинного элемента записываем элемент из самого нижнего уровня дерева.
Восстанавливаем (пересортировываем) пирамиду.
Самый большой элемент из оставшихся снова в вершине. Снова отделяем его и записываем его в качестве предпоследнего элемента результата, и так далее...
Весь фокус алгоритма в том, что пирамида без дополнительных затрат хранится прямо в исходном массиве. По мере того, как размер пирамиды уменьшается, она занимает всё меньшую часть массива, а результат сортировки записывается начиная с конца массива на освободившиеся от пирамиды места.
Ещё одно объяснение идеи алгоритма можете посмотреть в этом комментарии.
Двоичное дерево
Двоичное дерево — структура данных, в которой каждый элемент имеет левого и/или правого потомка, либо вообще не имеет потомков. В последнем случае элемент называется листовым.
Если элемент A имеет потомка B, то элемент A называется родителем элемента B. В двоичном дереве существует единственный элемент, который не имеет родителей; такой элемент называется корневым.
Дата публикования: 2014-12-08; Прочитано: 328 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!