优先队列

#include <stdio.h>
#include <malloc.h>

#define Max 100000

struct MinHeapStruct {
    int size;
    int array[Max];
};
typedef struct MinHeapStruct* MinHeap;

MinHeap createMinHeap();
void insertMinHeap( MinHeap h, int data );
int deleteMinHeap( MinHeap h );
void makeMinHeap( MinHeap h );

int main( void ) {
    int i = 0;
    int data = 0;
    MinHeap h = createMinHeap();
    FILE* fp = fopen("MinHeap.txt", "r");

//    for( i = 0; i < 100; i++ ) {
//        fscanf(fp, "%d", &data);
//        if( i == 0 ) {
//            h->array[1] = data;
//            h->size++;
//        }
//        else {
//            insertMinHeap( h, data );
//        }
//    }
    for( i = 0; i < 100; i++ ) {
        fscanf(fp, "%d", &h->array[i+1] );
        h->size++;
    }

    makeMinHeap( h );

//    for( i = 0; i < 100; i++ ) {
//        printf("%d ", h->array[i+1] );
//    }
//    printf("\n\n");
//
    for( i = 0; i < 102; i++ ) {
        data = deleteMinHeap( h );
        printf("%d ", data);
    }

    return 0;
}
MinHeap createMinHeap() {
    MinHeap h = ( MinHeap )malloc( sizeof(struct MinHeapStruct) );

    h->array[0] = -100000000;
    h->size = 0;
}
void insertMinHeap( MinHeap h, int data ) {
    h->array[++h->size] = data;
    int Parent = 0;
    int Child = h->size;

    int tmp = 0;

    for( Parent = h->size/2; Parent >= 1; Parent = Child/2 ) {
        if( h->array[Parent] <= h->array[Child] ) { break; }
        tmp = h->array[Parent];
        h->array[Parent] = h->array[Child];
        h->array[Child] = tmp;
        Child = Parent;
    }
}
int deleteMinHeap( MinHeap h ) {

    if( h->size == 0 ) {
        return h->array[0];
    }
    int i = 0, e = h->array[1], t = h->array[h->size--];
    int parent, child;

    for( parent = 1; parent*2 <= h->size; parent = child ) {

        child = parent*2;
        if( child != h->size && h->array[parent*2] > h->array[parent*2+1] ) {
            child++;
        }//第一个条件很重要!!!!

        if( h->array[child] >= t ) { break; }
        h->array[parent] = h->array[child];
    }
    h->array[parent] = t;

    return e;
}
void makeMinHeap( MinHeap h ) {
    int node, parent, child;
    int tmp = 0;

    for( node = h->size/2; node >= 1; node-- ) {
        tmp = h->array[node];

        for( parent = node; parent*2 <= h->size; parent = child ) {

            child = parent*2;
            if( child != h->size && h->array[child+1] < h->array[child] ) {
                child++;
            }

            if( tmp <= h->array[child] ) {
                break;
            }
            h->array[parent] = h->array[child];
        }
        h->array[parent] = tmp;
    }
}
唉,找不到比较好的prim的代码,自己写ing。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值