优先队列
https://blog.csdn.net/Sungree/article/details/100834974
注意:因为是数组表示(有值的区域里没有空缺),所以这个二叉树是完全二叉树
大顶堆:
C语言代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define Type int 5 6 typedef struct HeapStruct{ 7 int capacity; 8 int size; 9 Type* eles; 10 }PriorityQueue; 11 12 PriorityQueue* Init(int max_size){ 13 PriorityQueue* pq; 14 if(max_size <= 0){ 15 printf("max_size is illegal !\n"); 16 return NULL; 17 } 18 pq = malloc(sizeof(PriorityQueue)); 19 if(pq == NULL){ 20 printf("malloc failed !\n"); 21 return NULL; 22 } 23 pq -> eles = malloc((max_size + 1)*sizeof(Type)); 24 if(pq -> eles == NULL){ 25 printf("eles malloc failed !\n"); 26 free(pq); //如果eles没有malloc成功,记得把pq给释放掉 27 return NULL; 28 } 29 memset(pq -> eles,0,(max_size + 1)*sizeof(Type));//记得要初始化 30 pq -> capacity = max_size; 31 pq -> size = 0; 32 return pq; 33 } 34 35 int is_Empty(PriorityQueue* pq){ //为什么不用bool?因为C语言有些编译器不能用bool 36 if(pq == NULL) return 0; 37 if(pq -> size == 0) return 1; 38 return 0; 39 } 40 41 int is_Full(PriorityQueue* pq){ 42 if(pq == NULL){ 43 printf("Queue is empty !\n"); 44 return 0; 45 } 46 if(pq -> capacity == pq -> size) return 1; 47 return 0; 48 } 49 50 int push(Type value,PriorityQueue* pq){ 51 if(is_Full(pq)){ 52 printf("Queue is full !\n"); 53 return 0; 54 } 55 printf("push %d\n", value); 56 int i = pq -> size + 1; 57 for(;i > 1;i /= 2){ //为什么i != 1?因为当i == 1时,i/2 == 0 就越界了 58 if(value > pq -> eles[i/2]) 59 pq -> eles[i] = pq -> eles[i/2]; 60 else 61 break; 62 } 63 /*int i; 64 for(i = pq->size+1; value > pq->eles[i/2] && i>1; i/=2){ 65 pq->eles[i] = pq->eles[i/2]; 66 } */ 67 pq -> eles[i] = value;//不要忘了把空穴补上 68 pq -> size ++; 69 return 1; 70 } 71 72 int find_max(PriorityQueue* pq,Type* max){ 73 if(is_Empty(pq)){ 74 printf("Queue is empty !\n"); 75 return 0; 76 } 77 *max = pq -> eles[1]; 78 return 1; 79 } 80 81 int pop(PriorityQueue* pq,Type* max){ 82 if(is_Empty(pq)){ 83 printf("Queue is empty !\n"); 84 return 0; 85 } 86 *max = pq -> eles[1]; 87 printf("Pop %d\n", pq->eles[1]); 88 Type last = pq -> eles[pq -> size]; 89 pq -> size --; 90 if(pq -> size == 0){ 91 pq -> eles[1] = 0; 92 return 1; 93 } 94 int i = 1,maxchild; 95 for(;2*i <= pq -> size;i = maxchild){ //这里重新调整优先队列和push是一样的,只是push是从下往上,这里是从在最上面往下补 96 maxchild = 2*i; 97 if(maxchild < pq -> size) 98 if(pq -> eles[maxchild] < pq -> eles[maxchild + 1]) 99 maxchild = maxchild + 1; 100 if(last < pq -> eles[maxchild]) 101 pq -> eles[i] = pq -> eles[maxchild]; 102 else 103 break; 104 } 105 pq -> eles[i] = last; 106 return 1; 107 } 108 109 int destroy(PriorityQueue* pq){ 110 if(pq == NULL) return 0; 111 free(pq -> eles); 112 pq -> eles = NULL; 113 free(pq); 114 pq = NULL; 115 printf("destroy success !\n"); 116 return 1; 117 } 118 119 int main(int argc, char *argv[]) { 120 //创建容量为6的优先队列 121 PriorityQueue *pq = Init(6); //init在定义时,定义为指针,因此其返回值是个指针,直接复制给pq 122 123 int arr[]={3,4,7,5,8,2,9,10} ; 124 int i = 0; 125 126 //试图插入多于6个的元素,最后两个元素将无法插入 127 for(i = 0; i<8; i++){ 128 push(arr[i], pq); 129 } 130 131 //遍历队列内容 132 printf("the value of pq are: ") ; 133 for(i=0; i<pq->size; i++){ 134 printf("%d ", pq->eles[i+1]); 135 } 136 printf("\n"); 137 printf("pq size is %d\n", pq->size); 138 139 Type max; 140 int size = pq->size; 141 //每次从堆顶取元素 142 for(i=0; i<size; i++){ 143 if(find_max(pq, &max)){ 144 printf("the max is %d\n", max); 145 pop(pq, &max); 146 } 147 } 148 printf("new size is %d\n", pq->size) ; 149 150 //销毁队列 151 destroy(pq); 152 153 return 0; 154 }

浙公网安备 33010602011771号