堆的简单实现
關于堆不做過多介紹
堆就是兒子的值一定不小于父親的值并且樹的節點都是按照從上到下,從左到右緊湊排列的樹。
(本文為二叉堆)
具體實現并不需要指針二叉樹,用數組儲存并且利用公式找到父子即可。
父:(i-1)/2
子:i*2+1,i*2+2
插入:首先把新數字放到堆的末尾,也就是右下角,然后查看父的數值,需要交換就交換,重復上述操作直到不需交換
刪除:把堆的第一個節點賦值為最后一個節點的值,然后刪除最后一個節點,不斷向下交換。
(兩個兒子:嚴格來說要選擇數值較小的那一個)
時間復雜度:和深度成正比,所以n個節點是O(logN)
int heap[MAX_N],sz=0; //定義數組和記錄個數的變量插入代碼:
void push(int x) {//節點編號int i=sz++;while(i>0){int p=(i-1)/2;//父if(heap[p]<=x)break;//直到大小順序正確跳出循環heap[i]=heap[p];//把父節點放下來i=p;}heap[i]=x;//最后把自己放上去}彈出:
int pop() {int ret=heap[0];//保存好值,最后返回int x=heap[--sz];while(i*2+1<sz){int a=i*2+1;//左孩子int b=i*2+2;//右孩子if(b<sz && heap[b]<heap[a])a=b;//找最小if(heap[a]>=x)break;//直到不需要交換就退出heap[i]=heap[a];//把兒子放上來i=a;}head[i]=x;//下沉到正確位置return ret;//返回 }?
總結