数据结构实现(优先级队列及堆排序类模板)
2010-01-13 12:51
363 查看
/* 优先级队列的堆实现(基于数组) */ #include "Array.cpp" template <class DataType> class CPriorityQueue { public: CPriorityQueue(); CPriorityQueue(const Array<DataType> & arr); void enqueue(const DataType & newElement); bool dequeue(DataType & remElement); bool isEmpty() const; void makeEmpty(); private: Array<DataType> elements; int heapsize; inline void heapify(int i); };
#include "PriorityQueue.h" template <class DataType> CPriorityQueue<DataType>::CPriorityQueue() : elements(2),heapsize(0) { } template <class DataType> CPriorityQueue<DataType>::CPriorityQueue(const Array<DataType> & arr) : elements(arr),heapsize(arr.length()) { for (int i=(heapsize-2)>>1;i>=0;i--) { heapify(i); } int trysize=2; for (;trysize<elements.length();trysize <<=1) { ; } if (trysize!=elements.length()) { elements.ChangeSize(trysize); } } template <class DataType> void CPriorityQueue<DataType>::enqueue(const DataType & newElement) { if (heapsize==elements.length()) { elements.ChangeSize(elements.length()<<1); } int i=heapsize; for (;(i!=0) && newElement>elements[(i-1)>>1];i=(i-1)>>1) { elements[i]=elements[(i-1)>>1]; } elements[i]=newElement; heapsize++; } template <class DataType> bool CPriorityQueue<DataType>::dequeue(DataType & remElement) { if (!heapsize) { return false; } remElement=elements[0]; heapsize--; elements[0]=elements[heapsize]; heapify(0); int trysize=elements.length(); while ((heapsize<=trysize>>2) && trysize > 2) { trysize >>=1; } if (trysize<elements.length()) { try { elements.ChangeSize(trysize); } catch (...) { } } return true; } template <class DataType> bool CPriorityQueue<DataType>::isEmpty() const { return !heapsize; } template <class DataType> void CPriorityQueue<DataType>::makeEmpty() { heapsize=0; try { elements.ChangeSize(2); } catch (...) { } } template <class DataType> inline void CPriorityQueue<DataType>::heapify(int i) { int leftChild,rightChild,largest; bool stop=false; DataType temp=elements[i]; leftChild=(i <<1 )+1; while (leftChild<heapsize && !stop) { rightChild=leftChild+1; largest=(rightChild==heapsize) ? leftChild : ((elements[leftChild]>elements[rightChild]) ? leftChild : rightChild); if (elements[largest]>temp) { elements[i]=elements[largest]; i=largest; leftChild=(i << 1)+1; } else { stop=true; } } elements[i]=temp; }
#include "PriorityQueue.cpp" #include <iostream> using namespace std; struct MyStruct { int id; float amount; bool operator>(const MyStruct & right) { return amount>right.amount; } }; /* 堆排序函数 */ template <class DataType> void heapSort(Array<DataType> & arr); void main() { int num; cin>>num; Array<MyStruct> arr(num); for (int i=0;i<arr.length();i++) { cin>>arr[i].id; cin>>arr[i].amount; } heapSort(arr); for (int j=0;j<arr.length();j++) { cout<<arr[j].id<<"/t"<<arr[j].amount<<endl; } } template <class DataType> void heapSort(Array<DataType> & arr) { CPriorityQueue<DataType> pq(arr); for (int i=arr.length()-1;i>=0;i--) { pq.dequeue(arr[i]); } }
相关文章推荐
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- 【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- 【数据结构】优先级队列的实现(适配器模式)
- 【数据结构】优先级队列的实现(适配器模式)
- 【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序
- [数据结构]用插入排序和选择排序的思想实现优先级队列
- 【数据结构】堆,堆实现优先级队列,堆排序
- 数据结构之带优先级的队列(C语言实现)
- 数据结构Java实现——②队列-->队列的“奇葩”二 优先级队列
- rabbitmq结合spring实现消息队列优先级的方法
- 堆实现优先级队列(算法导论第六章)
- 数据结构循环队列斐波拉契数列的实现(c语言)
- 数据结构编程笔记九:第三章 栈和队列 链队列的实现
- 数据结构:模板实现栈和队列
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- 用LinkedList实现队列和堆栈的数据结构
- 【数据结构练习】基于链表结构实现的队列
- 数据结构---队列链表c实现