使用数组实现最小堆

时间:2018-02-19 18:55:30

标签: c algorithm data-structures heap

我正在尝试在C中实现min Heap。

// Heaps:
// node i -> 2i and 2i+1 children
// 2i//2 = i and 2i+1//2 = i same parents

#include <stdio.h>
#include <stdlib.h>

#define max 100

int heap[max];
int size = 0;

void heapifyUp(){ // last element
    int i = size;

    while(i){ // 
        int parent = i/2;
        if (heap[parent]<heap[i]){
            int t = heap[parent];
            heap[parent] = heap[i];
            heap[i]=t;
        }        
    }
}

void heapifyDown(){ // top element
    int i = 0;

    while(i<=size){
        int c1 = 2*i;
        int c2 = 2*i + 1;
        int t = 0;
        if (heap[c1]>=heap[c2]){
            t = c2;
        }
        else{
            t = c1;
        }
        int temp = heap[i];
        heap[i] = heap[t];
        heap[t] = temp;
        i = t;
    }
}

void insert(int key){
    size = size + 1;
    heap[size] = key;
    heapifyUp();
}

int returnMin(){
    return heap[0];
}

int deleteMin(){
    int t = heap[0];
    heap[0] = heap[size];
    size = size - 1;
    heapifyDown();
    return t;
}

void printHeap(){

    int i = 0;
    while(i<=size){
        printf("%d",heap[i]);
        i = i + 1;
    }
}

int main(){
    insert(10);
    insert(20);
    insert(11);
    insert(7);
    insert(18);

    printHeap();
    printf("%d",deleteMin());

    insert(110);
    insert(-7);
    insert(15);

    printf("%d",deleteMin());
}

问题在于,当我运行程序时,我没有输出,程序也没有终止。

我认为我已正确实施了逻辑。

使用调试器和C很难,因为我在Mac上(不支持Codeblocks,从来没有真正理解如何使用gdb,我只是在文本编辑器上使用内置的gcc编译器),所以我陷入困境这个问题。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

在heapifyUp中,您有一个while(i)语句。 &#34; I&#34;初始化为1,永远不会被修改。你没有任何&#34;返回&#34;或者&#34;打破&#34;在那个循环里面。所以情况永远都是真的。

答案 1 :(得分:1)

您的代码存在一些问题,其中很少有问题:
正如Jorge所说,在你的heapifyUp()函数中,你永远不会上升,它只会停留在那里并进入无限循环。
2.在heapifyDown()函数中,您遇到了界限问题。你需要检查它的孩子是否有效。它有逻辑问题 3.另外,请决定是否要使用0索引数组或1个索引数组。因为你的一些函数认为它是0索引的,有些人认为它是1索引的。我根据1个索引数组进行了修正。如果你想我可以将它改为0索引或者它可能是你的作业。

我尽力做到最好,但仍需要进行一些修正:

#include <stdio.h>
#include <stdlib.h>

#define max 100

int heap[max];
int size = 0;

void heapifyUp(){ // last element
    int i = size;

    while(1){ // 
        int parent = i/2;
        if (parent > 0 && heap[parent] > heap[i]){
            int t = heap[parent];
            heap[parent] = heap[i];
            heap[i]=t;
            i = parent;
        } else {
            break;
        }
    }
}

void heapifyDown(){ // top element
    int i = 1;

    while(i<size){
        int c1 = 2*i;
        int c2 = 2*i + 1;
        int t;
        if (c1 <= size) {
            t = c1;
        } else {
            break;
        }
        if (c2 <= size && heap[c1] > heap[c2]){
            t = c2;
        }

        if(heap[i] >= heap[t]) break;

        int temp = heap[i];
        heap[i] = heap[t];
        heap[t] = temp;
        i = t;
    }
}

void insert(int key){
    size = size + 1;
    heap[size] = key;
    heapifyUp();
}

int returnMin(){
    return heap[1];
}

int deleteMin(){
    int t = heap[1];
    heap[1] = heap[size];
    size = size - 1;
    heapifyDown();
    return t;
}

void printHeap(){
    int i = 1;
    while(i <= size){
        printf("%d ", heap[i]);
        i++;
    }
    printf("\n");
}

int main()
{
    insert(10);
    insert(20);
    insert(11);
    insert(7);
    insert(18);

    printHeap();
    printf("%d\n",deleteMin());

    insert(110);
    insert(-7);
    insert(15);

    printHeap();
    printf("%d\n",deleteMin());
    return 0;
}