#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。
优先队列
最新推荐文章于 2024-11-25 15:14:27 发布