Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пирамидальная сортировка 
:(
    Опции темы
DimanNSK
  Дата 26.5.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



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

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, но в результате не отсортировываются два первых элемента.. Проясните ситуацию.. Пожалуйста.
PM MAIL   Вверх
toxx
Дата 26.5.2010, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

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


может они вычисляются 2*k-левый и 2*k+1-правый ?
PM MAIL   Вверх
DimanNSK
Дата 26.5.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.3.2009

Репутация: нет
Всего: нет



toxx, тогда для элемента с индексом 0, левый потомок будет иметь индекс 0, а правый 1.. Хотя по сути дела должны быть 1 и 2
PM MAIL   Вверх
toxx
Дата 26.5.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



DimanNSK
а корень?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.