00001
00002 #include "heap.h"
00003
00004 void scambia (frequenza** v, int i, int j)
00005
00006 {
00007 frequenza* app = v[i];
00008 v[i] = v[j];
00009 v[j] = app;
00010 }
00011
00012 heap::heap(frequenza** pf, int n)
00013 {
00014 v = pf;
00015 last = n-1;
00016 buildheap();
00017 }
00018
00019 void heap::down(int i)
00020
00021
00022 {
00023 int son = 2*i+1;
00024 if (son == last)
00025 if (v[son]->freq < v[i]->freq) scambia (v,i,son);
00026 if (son < last)
00027 {
00028 if (v[son]->freq > v[son+1]->freq) son++;
00029 if (v[son]->freq < v[i]->freq)
00030 {
00031 scambia (v,i,son);
00032 down (son);
00033 }
00034 }
00035 }
00036
00037 frequenza* heap::estrai()
00038 {
00039 frequenza* app = v[0];
00040 v[0] = v[last--];
00041 down (0);
00042 return app;
00043 }
00044
00045 int heap::lastn()
00046 {
00047 return last;
00048 }
00049
00050 void heap::inserisci (frequenza* f)
00051 {
00052 v[++last] = f;
00053 up(last);
00054 }
00055
00056 void heap::up (int i)
00057
00058
00059 {
00060 if (i <= 0) return;
00061 if (v[(i-1)/2]->freq > v[i]->freq)
00062 {
00063 scambia (v,i,(i-1)/2);
00064 up ((i-1)/2);
00065 }
00066 }
00067
00068 void heap::buildheap()
00069 {
00070 for (int i = last/2; i >= 0; i--)
00071 down (i);
00072 }