题解 | #【模板】堆#
【模板】堆
https://www.nowcoder.com/practice/13f61c8c92404f5ea5d6fa4c692869fb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//void print(int* h, int len){
// // printf("\n");
// for(int i=0; i< len; i++){
// printf("%d ",h[i]);
// }
// printf("\n");
//}
void swap(int* h, int i, int j){
// 交换
int temp = h[i];
h[i] = h[j];
h[j] = temp;
}
void adjust_up(int *h, int len){
// 向上调整大根堆,用于建堆;
if(len > 1){
for(int i = len-1; i>=0; i--){
int father;
if(i%2 == 0){
father = (i-2)/2;
}else{
father = (i-1)/2;
}
if(father < 0){
break;
}
if(h[i]>h[father]){
swap(h, i, father);
}
}
}
}
void adjust_down(int *h, int len){
// 向下调整大根堆,用于调整堆;
if(len > 1){
for(int i = 0; i<len; i++){
int son_l, son_r;
son_l = i*2+1;
son_r = i*2+2;
if(son_l < len){
if(h[i]<h[son_l]){
swap(h, i, son_l);
}
if(son_r < len){
if(h[i]<h[son_r]){
swap(h, i, son_r);
}
}
}else{
break;
}
}
}
}
void move0(int*h, int len){
for(int i=len; i>0; i--){
h[i] = h[i-1];
}
}
void push_x(int *h, int len, int x){
// x加入堆。保证x为int型整数,不输出任何内容
// 建堆
if(len == 0){
h[0] = x;
}else{
if(x>h[0]){
move0(h, len);
h[0] = x;
}else{
h[len] = x;
adjust_up(h, len+1);
}
}
}
void top(int *h, int len){
// 输出堆顶元素。若堆为空,输出"empty"(不含引号)。
if(len == 0){
printf("empty\n");
}else{
printf("%d\n", h[0]);
}
}
void pop(int *h, int len){
top(h, len);
if(len>1){
// 输出堆顶元素,且弹出堆顶。若堆为空,输出"empty"(不含引号)
swap(h, 0, len-1);
// print(h, len-1);
adjust_down(h, len-1);
// print(h, len-1);
}
}
int main() {
int n;
scanf("%d",&n);
getchar();
// 堆数组
int heap[n];
int num=0;
for(int i=0; i<n; i++){
char line[100];
int line_num=0;
line_num = 0;
gets(line);
if(line[0]=='t'){
// if(strstr(line,"top")>0){
// printf("TOP \n");
top(heap, num);
// if(num>0){
// print(heap, num);
// }
}else if(line[1]=='o'){
// }else if(strstr(line,"pop")>0){
// printf("POP \n");
pop(heap, num);
if(num>0){
num--;
}
// else{
// print(heap, num);
// }
}else{
strtok(line, " ");
char* ttt = strtok(NULL, "\n");
line_num = atoi(ttt);
// printf("PUSH ");
// printf("%d \n",line_num);
push_x(heap, num, line_num);
num++;
// print(heap, num);
}
}
return 0;
}
阿里巴巴公司氛围 652人发布