算法导论第6章代码之优先级队列
2014-03-25 18:43
260 查看
这里讲述的是用堆实现的最大优先级队列,建立的是最大堆,主要实现3个算法,一个是抽取对头元素,也就是整个堆里面最大的那个数,还有一个是提高某个节点的优先级,最后是往队尾插入元素。
1、建立最大堆
2、抽取对头元素
3、将队列中的某个元素的优先级提高
注意在插入的时候,要确保数组有足够的存储空间,n是当前数组元素的下一个位置
本文出自 “移动开发” 博客,请务必保留此出处http://ikinglai.blog.51cto.com/6220785/1384011
1、建立最大堆
void build_max_heap(int *a, int i, int n) { int max = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && a[left] > a[max]) { max = left; } if (right < n && a[right] > a[max]) { max = right; } if (i != max) { int temp = a[i]; a[i] = a[max]; a[max] = temp; build_max_heap(a, max, n); } }
2、抽取对头元素
int extract_max(int *a, int n) { int max = a[0]; a[0] = a[n-1]; build_max_heap(a, 0, n-1); return max; }
3、将队列中的某个元素的优先级提高
int increase_key(int *a, int i, int key) { if (key < a[i]) { return -1; } a[i] = key; int p; while (i > 0 && a[p=(i-1)/2] < a[i]) { int temp = a[p]; a[p] = a[i]; a[i] = temp; i = p; } return 0; }4、队尾插入元素
void heap_insert(int *a, int n, int key) { int i = n; a[i] = key; int p; while (i > 0 && a[p=(i-1)/2] < a[i]) { int temp = a[p]; a[p] = a[i]; a[i] = temp; i = p; } }
注意在插入的时候,要确保数组有足够的存储空间,n是当前数组元素的下一个位置
本文出自 “移动开发” 博客,请务必保留此出处http://ikinglai.blog.51cto.com/6220785/1384011
相关文章推荐
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 《算法导论》笔记 第6章 6.5优先级队列
- 《算法导论》第六章-优先级队列(伪代码)
- 《算法导论》第六章----优先级队列(代码实现+部分练习)
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》第6章 堆排序 (2)优先级队列
- 《算法导论》读书笔记之第6章 优先级队列
- 算法导论-优先级队列
- 优先级队列,代码参考范例
- 数据结构之--优先级队列(Java代码)
- 算法导论笔记(二) : 优先级队列
- 算法导论-优先级队列-C语言
- 算法导论:堆排序的应用---优先级队列
- 《算法导论》 6.5优先级队列
- 《算法导论》笔记--优先级队列
- (日志,《算法导论》.6.4)优先队列,堆,代码
- 首先给出最小优先级队列和最大优先级队列完整代码,稍后分析博文奉上
- C++ - "priority_queue" 优先级队列 简介 及 代码