Heap.cpp
上传用户:lin85885
上传日期:2013-04-27
资源大小:796k
文件大小:2k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include <iostream.h>
  3. #include "Heap.h"
  4. void Heap::swap(int i,int j)
  5. {
  6.     heap_node tmp = ref(i);
  7.     ref(i) = ref(j);
  8.     ref(j) = tmp;
  9.     ref(i).obj->setHeapPos(i);
  10.     ref(j).obj->setHeapPos(j);
  11. }
  12. void Heap::upheap(int i)
  13. {
  14.     if( i==0 ) return;
  15.     if( ref(i).import > ref(parent(i)).import ) {
  16.         swap(i,parent(i));
  17.         upheap(parent(i));
  18.     }
  19. }
  20. void Heap::downheap(int i)
  21. {
  22.     if (i>=size) return;        // perhaps just extracted the last
  23.     int largest = i,
  24.         l = left(i),
  25.         r = right(i);
  26.     if( l<size && ref(l).import > ref(largest).import ) largest = l;
  27.     if( r<size && ref(r).import > ref(largest).import ) largest = r;
  28.     if( largest != i ) {
  29.         swap(i,largest);
  30.         downheap(largest);
  31.     }
  32. }
  33. void Heap::insert(Heapable *t,float v)
  34. {
  35.     if( size == maxLength() )
  36.     {
  37. cerr << "NOTE: Growing heap from " << size << " to " << 2*size << endl;
  38. resize(2*size);
  39.     }
  40.     int i = size++;
  41.     ref(i).obj = t;
  42.     ref(i).import = v;
  43.     ref(i).obj->setHeapPos(i);
  44.     upheap(i);
  45. }
  46. void Heap::update(Heapable *t,float v)
  47. {
  48.     int i = t->getHeapPos();
  49.     if( i >= size )
  50.     {
  51. cerr << "WARNING: Attempting to update past end of heap!" << endl;
  52. return;
  53.     }
  54.     else if( i == NOT_IN_HEAP )
  55.     {
  56. cerr << "WARNING: Attempting to update object not in heap!" << endl;
  57. return;
  58.     }
  59.     float old=ref(i).import;
  60.     ref(i).import = v;
  61.     if( v<old )
  62.         downheap(i);
  63.     else
  64.         upheap(i);
  65. }
  66. heap_node *Heap::extract()
  67. {
  68.     if( size<1 ) return 0;
  69.     swap(0,size-1);
  70.     size--;
  71.     downheap(0);
  72.     ref(size).obj->notInHeap();
  73.     return &ref(size);
  74. }
  75. heap_node *Heap::kill(int i)
  76. {
  77.     if( i>=size )
  78. cerr << "WARNING: Attempt to delete invalid heap node." << endl;
  79.     swap(i, size-1);
  80.     size--;
  81.     ref(size).obj->notInHeap();
  82.     if( ref(i).import < ref(size).import )
  83. downheap(i);
  84.     else
  85. upheap(i);
  86.     return &ref(size);
  87. }