• XSS.stack #1 – первый литературный журнал от юзеров форума

Помогите с пирамидальной сортировкой (heapsort) C++

Alexey18

(L3) cache
Пользователь
Регистрация
11.06.2023
Сообщения
163
Реакции
30
Всем привет. Пацаны, выручайте пожаалуйста. Препод просто мозг выносит вторую пару. Я прочел 4 книги(не кнута), по делфи и плюсам, там +- то что даёт нейронка, но это полная неверная дичь.

В общем я пытаюсь сделать реализацию пирамидальной сортировки Кнута(строго его), алгоритм есть+диаграмма ненси-шердмана от препода.
Посмотрите диаграмму и код кто-нибудь, это верно я написал по алгу? Скажите пж. ps. код рабочий.

1729370269584.png

1729370291768.png
Диаграмма препода

Код который я подготовил +-. Скажите что тут может быть не так. Может что не верно?(пока не сдавал), может найдете какую-то оплошность? Я просто не знаю как 1 в 1 реализовать
C++:
void sortH(int* arK, int N)
{
    int l = N / 2, r = N - 1, K;

    // H1: начальная установка
    while (l > 0) {
        // H2: уменьшаем шаг
        l = l - 1;
        K = arK[l];

        int i = l, j = 2 * i + 1;

        // H3, H4: подготовиться к "протаскиванию"
        while (j <= r) {
            // H5: найти большего потомка
            if (j < r && arK[j] < arK[j + 1]) {
                j = j + 1;
            }

            // H6: завершить цикл, если K больше или равен arK[j]
            if (K >= arK[j]) {
                break;
            }

            // H7: подтащить его наверх
            arK[i] = arK[j];
            i = j;
            j = 2 * i + 1;
        }
        // H8: записать K
        arK[i] = K;
    }

    // Повторение процесса, извлечение элементов
    while (r > 0) {
        // Перемещаем корень кучи (максимум) в конец
        K = arK[r];
        arK[r] = arK[0];
        r = r - 1;

        // Восстанавливаем кучу
        int i = 0, j = 1;
        while (j <= r) {
            // Найти большего потомка
            if (j < r && arK[j] < arK[j + 1]) {
                j = j + 1;
            }

            // Если K больше или равен потомку, выходим
            if (K >= arK[j]) {
                break;
            }

            // Поднимаем потомка
            arK[i] = arK[j];
            i = j;
            j = 2 * i + 1;
        }

        // Записываем K на место
        arK[i] = K;
    }
}


Кто разбирается в алгоритмах помогите пжпжпж.
 
Последнее редактирование модератором:
А ты тест не хочешь запилить, сразу узнаешь рабочий ли код?
дело не в работоспособности. А в том что препод выносит мозг, делая из мухи слона.
Код Выше рабочий, но меня интересует правильно ли я повторил по Кнуту и диаграмме Шефмана сортировку. Правильно ли я понял алг?


По тому что, на паблик код будет переработка.
 
дело не в работоспособности. А в том что препод выносит мозг, делая из мухи слона.
Код Выше рабочий, но меня интересует правильно ли я повторил по Кнуту и диаграмме Шефмана сортировку. Правильно ли я понял алг?


По тому что, на паблик код будет переработка.
Мне кажется этот вопрос лучше задавать где-нибудь на https://ru.stackoverflow.com/ или англоязычной версии сайта.
 
Many textbook or lecture‐note descriptions use 1-based indexing.
Common pattern (0-based):
C++:
int i = (N - 1) / 2; i >= 0; i--
which is effectively the same.

And now with your professor, the main “differences” might just be cosmetic.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх