堆排序实现优先队列
2013-08-02 22:11
351 查看
因为写A*算法的需要,为了提高速度,顺手抄了个优先队列。。。。纯手搓
优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.
我觉得关键在于:在堆排序的基础上,把建堆去掉就可以了,
插入的时候插在叶子结点处,然后向上调整,删除的时候删除掉根结点,然后向下调整
View Code
优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.
我觉得关键在于:在堆排序的基础上,把建堆去掉就可以了,
插入的时候插在叶子结点处,然后向上调整,删除的时候删除掉根结点,然后向下调整
#include<stdio.h> #include<stdlib.h> #include<string.h> int heap[400000],hlength; void down(int p)//删除后向下调整 { int a,q=p*2; a=heap[p];//保存当前结点的值 while(q<=hlength) { if(q<hlength&&heap[q]>heap[q+1])//选择两个子结点中的一个最小的 q++; if(heap[q]>=a)//如果子结点比当前结点大,就结束 break; else { heap[p]=heap[q]; p=q;q=p*2; } } heap[p]=a;//还原原来的点 } int min() { int r=heap[1]; heap[1]=heap[hlength--]; down(1); return r; } void up(int p)//插入后向上调整 { int q=p/2,a;//q是父节点 a=heap[p]; while(q>0&&a<heap[q])// { heap[p]=heap[q];//如果父节点结点比当前结点大就交换 p=q;q=p/2; } heap[p]=a;//还原原来的点 } void insert(int a) { heap[++hlength]=a; up(hlength); } int main() { int x,m,i; hlength=0; while(scanf("%d%d",&m,&x)!=EOF) { if(m==1) insert(x); else printf("之前输入最小的是%d\n",min()); for(i=1;i<=hlength;i++) printf("%d ",heap[i]); printf("\n"); } return 0; }
View Code
相关文章推荐
- 最小堆得实现;优先队列的堆实现;堆排序的时间复杂度nlgn;
- 优先队列(二叉堆实现) + 堆排序
- 基于二叉堆实现的优先队列和堆排序
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 堆的实现、堆排序、优先队列
- 利用优先队列实现堆排序(自顶向下自底向上堆化全然二叉树的运用)
- 用java实现一个基于堆排序的优先队列
- 优先队列 之 堆排序实现(堆排序思想)
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 二叉堆,堆排序,STL优先队列的底层实现,剑指offer数据流中的中位数
- 堆排序实现优先队列(Priority queue)
- 利用优先队列实现堆排序(自顶向下自底向上堆化完全二叉树的运用)
- 优先队列【堆实现、二叉树的应用】
- 优先队列的 java 代码实现
- 优先队列--模板类实现
- 自己实现一个简单的优先队列-二叉堆
- 用二叉堆实现优先队列
- 优先队列的简单实现-二叉堆实现
- uva 11997 k个最小和(优先队列实现多路归并)题解