Куча сортирует «визуальные» деревья, печатает лишние нули - PullRequest
1 голос
/ 10 марта 2012

Я выучил сортировку кучи с визуальным представлением ее с помощью позорной древовидной диаграммы ( здесь ), поэтому я решил найти способ распечатать ее, и я очень хорошо продвинулся, далеко. Похоже, моя единственная проблема заключается в том, что если в строке больше нет значений для заполнения, моя программа по какой-то причине выводит нули.

Я уверен, что это, вероятно, ошибка в моем коде или дополнительная строка, которую нужно добавить, но я также ищу совет, если это был лучший подход. Код ниже.

#include <stdio.h>

int HeapArray[] = {165, 245, 398, 426, 575, 661, 775, 895, 901, 1028, 1184, 1283, 1350,1427, 1598, 1698};

int main()
{
    int i = 0, numL = 1;
    int j, k;

    for(k = 0; k < 6; k++)
    {
        if(HeapArray[i] == 0)
            break;

        for(j = 0; j < numL;j++)
        {
            printf("%d ", HeapArray[i]);
            i++;
        }
        printf("\n");
        numL *= 2;
    }

    return 0;
}

Что стоит упомянуть:

  • В другом самом цикле for я использую значение 6 в качестве максимального числа строк для печати, однако программа прекращает печатать в строке с последними значениями массива.
  • Я не выполнил никакого выравнивания, чтобы сделать диаграмму точной на 100%, так как казалось, что достаточно просто уйти напоследок (т. Е. Без лишнего кода, чтобы сбить меня с толку).

1 Ответ

1 голос
/ 10 марта 2012

Ваш индекс, вероятно, выходит за границы массива

У вас есть 16 элементов, поэтому сначала вы печатаете 1, затем печатаете 2, затем 3 и т. Д.

Всего в четвертой строке выведите 1 + 2 + 4 + 8 = 15.

Когда вы доберетесь до последней строки (пятая строка), у вас будет только один элемент для печати. Тем не менее, ваш внутренний цикл идет от 0 до 16, проходя через границы массива (и поэтому выводит 0 с)

Вы должны добавить проверку во внутренний цикл, чтобы убедиться, что у вас все еще достаточно элементов.

Обратите внимание, что я также настоятельно рекомендую вам на самом деле добавить элемент 0 в конец массива, чтобы вы не полагались на память за ее пределами

...