Advertisement
Loesome

Untitled

Apr 25th, 2014
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #include "HeapADT.h"
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. template <typename E> class Heap : public HeapADT<E>
  7. {
  8. private:
  9.     E* heap;
  10.     int maxSize;
  11.     int n;
  12.  
  13.     void swap(E &A, int i, int j) {
  14.         E aux = heap[i];
  15.         heap[i] = heap[j];
  16.         heap[j] = aux;
  17.     }
  18.     void heapfy(int pos){
  19.         int leftTemp, rightTemp, heapTemp;
  20.         leftTemp = left(pos);
  21.         rightTemp = right(pos);
  22.  
  23.         if((heap[pos] < heap[leftTemp]) || (heap[pos]< heap[rightTemp]))        {
  24.  
  25.             if(heap[leftTemp] > heap[rightTemp])            {
  26.                 swap(heap[pos], pos, leftTemp);
  27.                 heapTemp = leftTemp;
  28.             }
  29.  
  30.             else            {
  31.                 swap(heap[pos],pos,rightTemp);
  32.                 heapTemp = rightTemp;
  33.             }
  34.             heapfy(heapTemp);
  35.         }
  36.     }
  37.     bool prior(int a, int b)
  38.     {
  39.         return (a>b);
  40.     }
  41. public:
  42.     Heap(E* h, int num, int max)     {
  43.         heap = h;
  44.         n = num;
  45.         maxSize = max;
  46.         buildMaxHeap();
  47.     }
  48.     int size() const{
  49.         return n;
  50.     }
  51.     bool isLeaf(int pos) const     {
  52.         return (pos >= n/2) && (pos < n);
  53.     }
  54.     int left(int pos) const  {
  55.         return 2*pos + 1;
  56.     }
  57.     int right(int pos) const  {
  58.         return 2*pos + 2;
  59.     }
  60.     int parent(int pos) const  {
  61.         return (pos-1)/2;
  62.     }
  63.     void buildMaxHeap()  {
  64.         for (int i=n/2-1; i>=0; i--) {
  65.             heapfy(i);
  66.         }
  67.     }
  68.     void insert(const E& it) {
  69.         if (n < maxSize) {
  70.             int curr = n++;
  71.             heap[curr] = it;
  72.  
  73.             while ((curr!=0) &&
  74.                    (prior(heap[curr], heap[parent(curr)]))) {
  75.                 swap(heap, curr, parent(curr));
  76.                 curr = parent(curr);
  77.             }
  78.         }
  79.         else{
  80.             string strAux = "Heap is full!";
  81.             return strAux;
  82.         }
  83.     }
  84.     E removefirst() {
  85.         if(n > 0){
  86.             swap(heap, 0, --n);
  87.             if (n != 0){
  88.                 heapfy(0);
  89.             }
  90.             return heap[n];
  91.         }
  92.         else{
  93.             string strAux = "Heap is empty";
  94.             return strAux;
  95.         }
  96.     }
  97.     E remove(int pos) {
  98.         if((pos >= 0) && (pos < n)){
  99.             if (pos == (n-1)){
  100.                 n--; }
  101.  
  102.             else {
  103.                 swap(heap, pos, --n);
  104.                 while ((pos != 0) &&
  105.                        (prior(heap[pos], heap[parent(pos)]))) {
  106.                     swap(heap, pos, parent(pos));
  107.                     pos = parent(pos);
  108.                 }
  109.                 if (n != 0) {
  110.                     heapfy(pos);
  111.                 }
  112.             }
  113.             return heap[n];
  114.         }
  115.         else{
  116.             string strAux = "Bad position";
  117.             return strAux;
  118.         }
  119.     }
  120. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement