堆
3.堆的操作的复杂度
堆的两种操作所花的时间都和树的深度成正比。因此,如果一共有n个元素,那么每个操作可以在O(logN)的时间内完成。
1 int heap[MAX_N], sz = 0; 2 void push(int x){ 3 int i = sz++; 4 5 while(i > 0){ 6 //父亲节点的编号 7 int p = (i - 1) / 2; 8 9 //如果已经没有大小颠倒则退出 10 if(heap[p] <= x) 11 break; 12 13 //把父亲节点的数值放下来,而把自己提上去 14 heap[i] = heap[p]; 15 i = p; 16 } 17 18 heap[i] = x; 19 }
1 int pop(){ 2 //最小值 3 int ret = heap[0]; 4 5 //要提到根的数值 6 int x = heap[--sz]; 7 8 //从根开始向下交换 9 int i = 0; 10 while(2 * i + 1 < sz){ 11 int a = 2 * i + 1, b = 2 * i + 2; 12 if(b < sz && heap[b] < heap[a]) a = b; 13 //如果已经没有大小颠倒则退出 14 if(x <= heap[a]) 15 break; 16 //把儿子的数值提上来 17 heap[i] = heap[a]; 18 i = a; 19 } 20 21 heap[i] = x; 22 23 return ret; 24 }
越努力,越幸运