#include <stdio.h>
int heap_size = 10;
void max_heapify(int *A, int i){  //维持最大堆性质int l = 2 * i + 1;int r = 2 * i + 2;int largest = 0;if(l <= heap_size-1 && A[l] > A[i])largest = l;else largest = i;if(r <= heap_size-1 && A[r] > A[largest])largest = r;if(i != largest){int temp = A[i];A[i] = A[largest];A[largest] = temp;max_heapify(A, largest);}
}
void build_heap(int *A){  //建堆int k;for(k = heap_size / 2 - 1; k >= 0; k--){max_heapify(A, k);}
}
void heap_sort(int *A){ //对数组使用堆排序build_heap(A);int k;for(k = heap_size - 1; k >= 1; k--){int temp = A[0];A[0] = A[k];A[k] = temp;heap_size--;max_heapify(A, 0);}
}int heap_maximum(int *A){  //取得优先级队列中的最大元素return A[0];
}
void heap_extract_max(int *A){  //优先级队列中的最大元素出队int max = A[0];A[0] = A[heap_size - 1];heap_size--;max_heapify(A, 0);
}
void heap_increase_key(int *A, int i, int key){  //将优先级队列中给定位置的值增加到指定值if(key < A[i]){printf("%s", "Error: The key should be bigger than the current value in i!");return;}   A[i] = key;while(i > 0 && A[i] > A[i/2]){int temp = A[i];A[i] = A[i/2];A[i/2] = temp;i = i/2;}
}
void heap_insert(int *A, int key){  //向优先级队列中加入一个元素heap_size++;A[heap_size - 1] = -1;heap_increase_key(A, heap_size - 1, key);
}void heap_output(int *A, int heap_size){  //输出堆中元素int i;for(i=0; i<heap_size; i++){printf("%d ", A[i]);}printf("%c", '\n');
}
int main(){  //测试int A[] = {3,5,8,2,7,10,1,0,32,4};int i;printf("%s", "Build heap...\n");build_heap(A);heap_output(A, heap_size);printf("The max value of this heap is %d.\n", heap_maximum(A));int increase_index = 1, key = 35;printf("Increase No. %d to %d.\n", increase_index, key);heap_increase_key(A, 1, 35);heap_output(A, heap_size);printf("Extract the maximum number of this heap.\n");heap_extract_max(A);heap_output(A, heap_size);int insert_value = 100;printf("Insert the value %d to this heap.\n", insert_value);heap_insert(A, 100);heap_output(A, heap_size);printf("Sort this heap.\n");int heap_size_before_sort = heap_size;heap_sort(A);heap_output(A, heap_size_before_sort);
}

《算法导论》第六章之堆和优先级队列相关算法C语言实现相关推荐

  1. 算法导论 第六章 堆排序 习题6.5-8 k路合并排序

    /*  * 请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法.  * 此处n为所有输入链表中元素的总数.(提示:用一个最小堆来做k路合并)  *  * 思路:利用有k个元素 ...

  2. 位向量(bit vector)(算法导论第十一章11.1-2)

    位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少得多.说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的 ...

  3. 假设一动态集合S用一个长度为m的直接寻址表T来表示。请给出一个查找S中最大元素的过程。(算法导论第十一章11.1-1)

    假设一动态集合S用一个长度为m的直接寻址表T来表示.请给出一个查找S中最大元素的过程.你所给的过程在最坏情况下的运行时间是多少. (算法导论第十一章11.1-1) #include "Key ...

  4. 算法复习第六章第七章

    算法复习第六章第七章 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后问题 第七章分支限界法 0-1bag问题 TSP问题 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后 ...

  5. 算法图解第六章笔记与习题(广度优先搜索)

    算法图解第六章笔记与习题(广度优先搜索) 文章目录 算法图解第六章笔记与习题(广度优先搜索) 6.1 图(graph) 6.2 广度优先搜索 6.3.1 查找最短路径 6.3.2 队列 6.4 实现图 ...

  6. 算法导论第2章(3) 二分查找 binary search

    二分查找(分治法). 二分查找也是一种分治法的实现,每一次查找将数据分为两个部分,问题规模都减小一半.这样查找的时间复杂度为logN.因为其实查找过程建立了一棵有N个节点的二叉树,查找次数是这棵树的高 ...

  7. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  8. 《恋上数据结构第1季》二叉堆实现优先级队列

    优先级队列(Priority Queue) 优先级队列简介 优先队列的底层实现 二叉堆实现优先级队列源码 测试代码 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基 ...

  9. 堆和优先级队列3:不泡妹子都要会的LeetCode7道题之一

    我们前面费了那么大篇幅介绍堆和优先级队列,就是为了分析本文的7道题.而这7道题, 特别!特别!特别! 重要!重要!重要! 不过呢,正如我们前面说的,这些题目其实知道怎么处理就行,不必一定要写出来. 1 ...

最新文章

  1. sqlserver 批量插入数据(此方式同样适用mysql)
  2. Rabbit MQ安装配置及常见问题
  3. cve-2018-2628 Weblogic反序列化漏洞实现反弹shell
  4. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩
  5. Java isAlive()和join()的使用
  6. 计算机检索技巧知识,初学者常用电脑技巧知识
  7. GitHub 上 57 款最流行的开源深度学习项目【转】
  8. Lua的继承(利用setmetatable)
  9. 容器学习 之 管理Volumn(十七)
  10. android-api28转换到api19-不能编译
  11. 后端学习 - MySQL存储引擎、索引与事务
  12. NeurIPS2021 VALUE:快来刷榜吧!微软提出视频多模态新基准,同时含检索、caption、QA等多个任务!...
  13. Perform 浮动工具栏 无标题窗口的移动
  14. Mybatis拦截器失效
  15. java p12证书_java引用微信支付的p12证书文件
  16. 计算机组成原理实验二八位寄存器,计算机组成原理课后参考答案
  17. AI综述专栏 | 多模态学习研究进展综述
  18. cf487e Tourists 题解(圆方树)
  19. python图形分析_使用Python图形化分析大Log文件
  20. Objective-C的方法替换

热门文章

  1. 数据安全法等相关法律等的归纳小结
  2. EasyNVR网页摄像机直播方案H5前端构建之:如何播放HLS
  3. 微信公众平台可以修改微信号了,微信号怎么设置好。
  4. 视频教程-2019年人工智能热门案例精讲之P图美化照片-深度学习
  5. 计算机毕业设计(42)java小程序毕设作品之小说电子书阅读小程序系统
  6. 2022年北京大数据技能大赛“隐私计算”赛道初赛完结!12强出炉
  7. 什么击计算机窗口可以打开资源管理器,如何打开资源管理器? 5种打开资源管理器的方法...
  8. NVMe1.4 Admin Command 学习(3)-- fw commit sanitize
  9. 移植opencv到嵌入式arm详细过程
  10. 简易英文问答系统(glove.6B词向量)