Двоичные кучи - эффективный способ реализации очередей приоритетов. Единственная гарантия порядка, которую делает куча, состоит в том, что элемент наверху имеет наивысший приоритет (возможно, это «самый большой» или «самый маленький» в соответствии с каким-то порядком). Куча - это двоичное дерево, обладающее свойствами: Свойство Shape: дерево заполняется сверху вниз слева направо. Order prperty: элемент на любом узле больше (или меньше, если наименьший имеет наивысший приоритет), чем его два дочерних узла. Когда итератор посещает все элементы, он, вероятно, делает это в обход уровня, то есть он посещает каждый узел на каждом уровне, прежде чем перейти на следующий уровень. Поскольку единственная гарантия порядка, заключающаяся в том, что узел имеет более высокий приоритет, чем его дочерние элементы, узлы на каждом уровне не будут иметь особого порядка.
Я не совсем понимаю, к каким указателям или управлению памятью вы обращаетесь. Однако это
cin >> a[1000];
неверно. Массив с 1000
элементами имеет последний действительный индекс как 999
. Вы получаете доступ к массиву за пределами, что вызывает неопределенное поведение. Может случиться что угодно (ну, не совсем, но лучше так об этом думать).
Правильный цикл должен быть («правильный» как в «минимальных изменениях, чтобы избежать уб»):
for(int h = 0;h < g; h++){
cout << " Input number: ";
cin >> a[h];
}
Однако, это также вызовет проблемы, когда пользователь вводит число больше чем 1000
для g
. Что вы действительно должны использовать, так это std::vector
, который позволяет вам выдвигать элементы сколько угодно, не указывая их размер во время компиляции.
PS: Если ваш код работает без указателей или ручного управления памятью, то нет причин добавлять его. Указатели и (ручное) управление памятью сложны, обучение тому, как с ними обращаться, в основном сводится к тому, как их избежать.