Heap数据结构介绍...
堆
优先队列(Pripority Queue)
- 特殊的
"队列",取出元素的顺序是按照元素的优先级大小,而不是进入队列的先后顺序。
 
- 使用数组构建:
- 插入:      总是插入数组的尾部
T = O(1) 
- 删除:      查找到最大的(最小的元素):
T=O(N)
     从数组中删除元素,需要将元素移动位置:T=O(N) 
 
- 链表构建:
- 插入:      总是插入链表的头部
T = O(1) 
- 删除:      查找到最大的(最小的元素):
T=O(N)
     删除元素:T=O(1) 
 
- 有序数组:
- 插入:     找到合适的位置:
T = O(N) or O(log2(N))
    移动元素并插入T=O(N) 
- 删除:     删除最后一个元素:
T=O(1) 
 
- 有序链表:
- 插入:     找到合适的位置:
T = O(N)
    插入T=O(1) 
- 删除:     删除最后一个元素(或者首元素):
T=O(1) 
 
最大堆 - 完全二叉树(大顶堆)
1、堆的创建 -- 创建空堆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | typedef strut HeapStruct * MaxHeap; struct HeadStruct{     ElementType * Elements;        int Size;                      int Capacity;              }
 
  MaxHeap create(int MaxSize) {     MaxHeap H = malloc(sizeof(struct HeapStruct));     H->Elements = malloc((MaxSize+1) * sizeof(ElementType));     H->size = 0;     H->Capactity = MaxSize;     H->Elements[0] = MaxData;   	return H; }
 
   | 
 
2,堆的插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | void Insert(MaxHeap H,ElementType item) {     int i;     if(isFull(H))     {         std::cout<<"最大堆已经满了"<<std::endl;     }     i = ++H->Size;            for(;H->Elements[i/2] < item; i = i/2)      {         H->Elements[i] = H->Elements[i/2];       }     H->Elements[i] = item; }
 
   | 
 
3、堆的删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
   | 
 
 
  EleementType deleteMax(MaxHeap H) {     int parent,child;     ElementType MaxChild,temp;     if(IsEmpty(H))     {         std::cout<<"堆为空"<<std::endl;         return ;     }     MaxItem = H->Elements[1];           temp = H->Elements[H->Size --];          for(parent = 1; parent*2 < H->Size;parent = child)       {         child = parent * 2;                  if((child != H->Size)) && (H->Elements[child] < H->Elements[child+1]))           {             child++;          }                  if(temp > H->Elements[child])         {             break;         }         else         {                          H->Elements[parent] = H->Elements[child];                      }     }          H->Elements[parent] = temp;     return MaxItem; }
 
 
  | 
 
4、最大堆的建立
  建立最大堆:将已经存在的N个元素按最大堆的要求存放在一个一维数组中
  1、通过插入操作,将N个元素一个一个的插入到空堆中去:T = O(NlogN)
  2、线性时间复杂度下建立最大堆
   1、将元素安顺序输入,先构建完全二叉树(下标为1开始)
   2、调整元素位置,使其满足最大堆
Heap
C++ 实现  
最小堆- 完全二叉树(小顶堆)