时间: 40min
难度: easy
/* 熟悉堆的'下拉'/'过滤操作'
* easy
*/
#include<stdio.h>
#include<stdlib.h>
#define N 1000
struct HeapNode{
int *Ele;
int size;
int capacity;
};
typedef struct HeapNode* Heap;
Heap CreateSmallHeap(int maxsize);
void Insert2Heap(Heap smallheap, int X);
void PrintPath(Heap h, int index);
int main(){
int n; // n个数字
int m; //m组标记
int *visit;
scanf(" %d %d", &n, &m);
visit = (int *)malloc(sizeof(int)*m);
Heap h = CreateSmallHeap(n);
int i;
for(i=0; i<n; i++){
int tmp;
scanf(" %d", &tmp);
Insert2Heap(h, tmp);
}
for(i=0; i<m; i++){
int tmp;
scanf(" %d", &tmp);
visit[i] = tmp;
PrintPath(h, visit[i]);
}
free(h->Ele);
free(h);
free(visit);
return 0;
}
/**
* print the path in heap with index x
*/
void PrintPath(Heap h, int index){
int i=h->size;
if(h == NULL){
return;
}
if(index>i){
return ;
}
for(i=index; i>1; i=i/2){
printf("%d ", h->Ele[i]);
}
printf("%d\n", h->Ele[i]);
}
/**
* 按照给定的大小建立一个小根堆,小根堆中下标0元素放置了最小元素--哨兵
*/
Heap CreateSmallHeap(int maxsize){
int *arr = (int *)malloc( (maxsize+1) * sizeof(int));
Heap h = (Heap) malloc(sizeof(struct HeapNode));
h->Ele = arr;
h->size = 0;
h->capacity = maxsize;
arr[0] = 1<<((sizeof(int)*8)-1) ; //minimum in int
return h;
}
void Insert2Heap(Heap smallheap, int X){
int i, p;
Heap h = smallheap;
++(h->size);
//从上往下拉,让出合适的位置给新插入的元素X
for( i=h->size; X < h->Ele[i/2]; i=p){
p = i/2;
if( X < h->Ele[p]){
h->Ele[i] = h->Ele[p];
continue;
}
break;
}
h->Ele[i] = X;
}