泛型优先级队列的实现
2011-10-12 17:05
465 查看
最近学了一下C++ 的泛型,想实践一下,于是写了一个泛型的优先级队列,并且用优先级队列实现了一个堆排序,很简洁。欢迎大家提意见。
如何实现一个优先级队列?要解决的两个关键问题便是入队和出队之后仍能保持小顶堆的性质。入队的元素不断的和父节点做比较,直到某个父节点比自己小或相等。出队后,让堆顶元素不断和两个孩子中的较小者比较,直到小于或等于较小的孩子。
现在在考虑如何添加一个比较器,使这个优先级队列可以建成一个大顶堆。
我自己测了几组测试数据,都通过了。下面给出1组浮点型的。
96.1 11.2 27.3 38.6 9.3 83.2 0
如何实现一个优先级队列?要解决的两个关键问题便是入队和出队之后仍能保持小顶堆的性质。入队的元素不断的和父节点做比较,直到某个父节点比自己小或相等。出队后,让堆顶元素不断和两个孩子中的较小者比较,直到小于或等于较小的孩子。
现在在考虑如何添加一个比较器,使这个优先级队列可以建成一个大顶堆。
#include <iostream> #include <algorithm> using namespace std; const int Max = 100; //用小顶堆做数据结构存储数据 template<typename T> class priorityQueue { private: T data[Max]; int length; //堆的大小,下标从1到length void swap( int i, int j) { T temp; temp = data[i]; data[i] = data[j]; data[j] = temp;; } void siftUp(int last) //新入队的元素跟父节点逐层比较 { for(int i=last; i>1 && data[i] < data[i/2]; i /= 2) { swap(i, i/2); } } void siftDown(int first) //出队后,堆顶元素和子元素逐层比较 { for(int i=first * 2; i <=length; i *= 2) { //i指向孩子中较小的那个孩子 if(i+1 <= length && data[i+1] < data[i]) i++; //让较小的孩子同父节点比较 if(data[i/2] <= data[i]) break; else swap(i/2, i); } } public: priorityQueue() { length = 0; } T front() { return data[1]; } void push(T key) { data[++length] = key; siftUp(length); } void pop() { swap(1, length); length --; siftDown(1); } int size() { return length; } bool empty() { return length == 0; } }; int main() { priorityQueue<float> q; float num; //利用优先级队列实现一个堆排序 while(cin >> num && num != 0) { q.push(num); } while(!q.empty()) { cout << q.front() << ' ' ; q.pop(); } system("pause"); return 1; }
我自己测了几组测试数据,都通过了。下面给出1组浮点型的。
96.1 11.2 27.3 38.6 9.3 83.2 0
相关文章推荐
- Redis 实现队列优先级
- 学习算法 - 优先级队列二叉堆实现
- 如何基于RabbitMQ实现优先级队列
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- 泛型队列实现文件C++
- 优先级队列实现
- 优先级队列的一种实现
- 第六章堆排序之“优先级队列实现先进先出队列和栈”(练习6.5-6)
- 一般队列和循环队列及优先级队列的实现
- STL中的优先级队列(priority_queue)的自己实现priqueue
- C++模板实现优先级队列
- 用redis实现支持优先级的消息队列
- 用redis实现支持优先级的消息队列
- JDK中优先级队列PriorityQueue实现分析
- 关于优先级队列的实现
- 双链表实现的消息队列,可支持优先级读取
- 如何基于RabbitMQ实现优先级队列
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- 优先级队列的Java ,C++ STL,堆实现