Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Пирамидальная сортировка


Автор: DimanNSK 26.5.2010, 14:22
У нас есть функция, осуществляющая пирамидальную сортировку:
Код

void sortByHeap(table* t)
{
        int i;
        elemTable temp;
 
        for (i = t->size / 2; i >= 0; i--)
                downHeap(t, i, t->size - 1);
 
        for(i = t->size - 1; i > 0; i--)
        {
                temp = t->data[i];
                t->data[i] = t->data[0];
                t->data[0] = temp;
                downHeap(t, 0, i - 1); 
        }
}
 
void downHeap(table* t, int k, int n)
{
        elemTable new_elem;
        int child;
 
        new_elem = t->data[k];
 
        while(k <= n / 2)
        {
                child = 2 * k;
 
                if ((child < n) && (t->data[child].num < t->data[child + 1].num)) 
                        child++;
 
                if (new_elem.num >= t->data[child].num) 
                        break; 
 
                t->data[k] = t->data[child];
                k = child;
        }
 
        t->data[k] = new_elem;
}


Сортирует все правильно, я одного понять не могу, почему мы child делаем равным 2*k, ведь потомки у звена дерева вычисляются как 2*k + 1 - левый и 2*k + 2 - правый. Я попробовал child = 2*k + 1, но в результате не отсортировываются два первых элемента.. Проясните ситуацию.. Пожалуйста.

Автор: toxx 26.5.2010, 14:51
Цитата

потомки у звена дерева вычисляются как 2*k + 1 - левый и 2*k + 2 - правый


может они вычисляются 2*k-левый и 2*k+1-правый ?

Автор: DimanNSK 26.5.2010, 15:13
toxx, тогда для элемента с индексом 0, левый потомок будет иметь индекс 0, а правый 1.. Хотя по сути дела должны быть 1 и 2

Автор: toxx 26.5.2010, 17:13
DimanNSK
а корень?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)