Heap

Build 创建

//筛选法
template<class T>
void SiftDown(T Data[], int i, int n){
     //用来保持以结点i为根的最小堆的性质,n是所有元素的个数
  int l = 2*i+1,r = 2*i+2, min=i;//找到i结点的两个孩子的下标
  if(l < n && Data[min] < Data[l])//和左子节点进行比较
    min = l;
  if(r < n && Data[min] < Data[r])//和右子结点进行比较
    min = r;
  if(min != i){
     //判断是否需要进行调整
    T t = Data[min];
    Data[min] = Data[i];
    Data[i] = t;
    SiftDown(Data,min,n);//递归对子结点进行调整
  }
}
//创建最小堆
template<class T>
void BuildHeap(T Data[], int n){
     
  int p = n/2-1;//求出非叶子节点的最大下标
  for(int i=p; i>=0; i--){
     
    SiftDown(Data,i,n);//调用SiftDown函数,保持最小堆的性质
  }
}

Insert 插入

//向堆中插入结点
template<class T>
void SiftUp(int position)  {
          // 从position向上开始调整
 int temppos = position;
 T temp = heapArray[temppos];
 while ((temppos > 0) && (heapArray[parent(temppos)] > temp)) {
     
  heapArray[temppos] = heapArray[parent(temppos)];
  temppos = parent(temppos);
 }
 heapArray[temppos] = temp;
}
template <class T>
bool Insert(const T& newNode)  {
     // 向堆中插入新元素newNode
 if (CurrentSize == MaxSize) 
          return FALSE;                                  // 堆空间已经满
 heapArray[CurrentSize] = new Node;
 SiftUp(CurrentSize);  // 向上调整
 CurrentSize++;
 return TRUE;
}

Delete 删除

//从堆中删除结点
template<class T>
T& RemoveMin()  {
      // 从堆顶删除最小值
 if (CurrentSize == 0) {
     
  cout<< "Can't Delete";// 调用RemoveMin之前,需要判断堆非空
  exit(1) ;
 }
 else  {
     
  swap(0 , --CurrentSize);             // 交换堆顶和最后一个元素
  if (CurrentSize>1)        
         SiftDown(0);       // 从堆顶开始筛选
  return heapArray[CurrentSize];
 }
}
template<class T>
bool Remove(int pos, T& node)  {
        // 删除给定下标的元素
 if ((pos < 0) || (pos >=CurrentSize))     
      return false;
 node = heapArray[pos];
 heapArray[pos] = heapArray[--CurrentSize]; // 用最后的元素值替代删除位置的元素
   if (heapArray[parent(pos)] > heapArray[pos])  
  SiftUp(pos);   // 当前元素小于父结点,需要上升调整
 else 
      SiftDown(pos);   // 当前元素大于父结点,向下筛
 return true;
}

你可能感兴趣的:(堆)