Я создал двоичную кучу с помощью C. Вот функции для инициализации кучи и вставки значений
int *heapArray; // pointer to array of elements in heap
int capacity = 0; // maximum possible size of min heap, initially set to 0
int heap_size; // Current number of elements in min heap
int d = 2; //max number of children per node
int getParent(int i) //get the parent index of i
{
return (i/d);
}
bool isFull() //check if heap is full
{
if(heap_size == capacity)
return true;
if(heap_size < capacity)
return false;
}
void initializeHeap(int cap) //initialize the heap
{
heap_size = 0;
capacity = cap;
heapArray = (int*)malloc(cap*sizeof(int));
}
void insertValue(int x) //insert a value into the heap
{
if(isFull()) //If heap is already full, double the heap size
{
capacity = 2*capacity;
heapArray = realloc(heapArray,capacity*sizeof(int));
}
heap_size = heap_size + 1;
heapArray[heap_size] = x; //insert new value into heap (not zero-indexed)
maxHeapSwim(heap_size);
}
void maxHeapSwim(int k) //move value up the heap to maintain max-heap order
{
while(k > 1 && heapArray[getParent(k)] < heapArray[k])
{
swap(&heapArray[k],&heapArray[parent(k)]);
k = parent(k);
}
}
Затем в методе main () я попытался вставить значения в кучу и распечататьиз значений:
int main()
{
initializeHeap(1); //Set the heap capacity to 1
insertValue(2);
insertValue(3);
insertValue(1);
insertValue(6);
insertValue(4);
printf("\n");
printf("%i", heapArray[1]);
printf("\n");
printf("%i", heapArray[2]);
printf("\n");
printf("%i", heapArray[3]);
printf("\n");
printf("%i", heapArray[4]);
printf("\n");
printf("%i", heapArray[5]);
printf("\n");
return 0;
}
Поскольку это максимальная куча, я надеялся, что результат будет выглядеть следующим образом:
6
4
1
2
3
Но вместо этого он выглядел так:
6
4
1
0
3
Я не понимаю.Почему 2 превращается в 0?У меня такое ощущение, что это как-то связано с тем, как я удваиваю размер кучи в функции insertValue () .... возможно, так, как я использую realloc.Есть что-то, что я делаю неправильно?
Еще одна вещь, на которую стоит обратить внимание, это то, что моя двоичная куча не индексируется нулями.Первое значение вставляется в heapArray [1], второе значение в heapArray [2] и так далее.