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 }

posted @ 2016-08-23 23:22  琴影  阅读(120)  评论(0编辑  收藏  举报