Advertisement
Loesome

Untitled

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