#include <stdio.h> #include <time.h> #include <stdlib.h> #define swape(a, b) ({\ __typeof(a) temp = a;\ a = b; b = temp;\ }) typedef struct priority_queue { int *data, cnt, size; } Priority_queue; Priority_queue *init(int n) { Priority_queue *p = (Priority_queue *)malloc(sizeof(Priority_queue)); p->data = (int *)malloc(sizeof(int) * (n + 1)); p->cnt = 0; p->size = n; return p; } void clear(Priority_queue *p) { if (!p) return ; free(p->data); free(p); return ; } int empty(Priority_queue *p) { return !q->cnt; } int top(Priority_queue *p) { return p->data[1]; } int push(Priority_queue *p, int n) { if(!p || p->cnt >= p->size) return
0;p->data[++p->cnt] =
n;int ind = p->cnt; while(ind >> 1 && n > p->data[ind >> 1]) { swape(p->data[ind >> 1], p->data[ind]); ind >>= 1; } return 1; } int pop(Priority_queue *p) { if(!p || empty(p)) return 0; p->data[1] = p->data[p->cnt--]; int ind = 1, key = 1; while(ind << 1 < p->cnt) { p->data[ind << 1] > p->data[ind] && (key = ind << 1); p->cnt > key && p->data[key] < p->data[ind << 1 | 1] && (key = ind << 1 | 1); if (ind == key) break; swape(p->data[ind], p->data[key]); ind = key; } return 1; } int main() { int k; srand(time(0)); #define MAX_N 20 Priority_queue *p = init(MAX_N); for (int i = 1; i <= MAX_N; i++) k = rand() % 100, printf(" %d,", k), push(p, k); printf("\n"); for (int i = 1; i <= MAX_N; i++) printf(" %d ", p->data[i]);printf("\n"); for (int i = 1; i <= MAX_N; i++) printf(" %d,", top(p)), pop(p); #undef MAX_N clear(p); printf("\n"); return 0; }
堆,优先队列,堆排序, 大顶堆
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
上一篇:c语言4-13 求1到n的和
下一篇:ARM指令系统
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
记一次JVM堆外内存泄漏问题
一次由JVM堆外内存泄漏引发的POD重启问题的解决之路。
JVM 内存泄漏 堆外内存 POD重启 -
优先队列 大顶堆
代码
c++ c语言 算法 i++ #include -
堆和堆排序(堆实现优先级队列)
堆是一种特殊类型的二叉树,它具有2个性质:1.每个节点的值大于等于其每个
数组 i++ 优先级队列 最小堆 子节点