生活随笔
收集整理的這篇文章主要介紹了
【堆】堆的基本操作总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
堆:
大頂堆:根結點比左右子樹更大;小頂堆:根節點比左右子樹更小。
定義一個堆: const int main=100;//heap為堆,n為元素個數
int heap[maxn],n=10;
?
調整堆: //在heap數組在[low,high]范圍進行向下調整
//其中low為欲調整的結點的數組下標,high一般為堆的最后一個元素的數組下標
void downAdjust(int low,int high){int i=low,j=2*i; //i為欲調整結點,j為其左孩子while(j<=high){ //存在孩子結點//如果右孩子存在,且右孩子的值大于左孩子if(j+1<=high&&heap[j+1]>heap[j]){j=j+1; //讓j存儲右孩子下標}//如果孩子中最大的權值比欲調整結點i大if(heap[j]>heap[i]){swap(heap[j],heap[i]); //交換最大權值的孩子與欲調整結點ii=j; //保持i為欲調整結點、j為i的左孩子j=2*i;}else{break; //孩子的權值比欲調整結點i要小,調整結束}}
} ?
建立堆: void createHeap(){for(int i=n/2;i>=1;i--){downAdjust(i,n);}
} ?
刪除堆頂元素: void deleteTop(){heap[1]=heap[n--]; //用最后一個元素覆蓋堆頂元素,并讓元素個數減1downAdjust(1,n); //向下調整堆頂元素
} ?
在堆內添加元素: //添加元素向上操作
//對heap數組在[low,high]范圍進行向上調整
//其中,對low一般設置為1,high表示欲調整結點的數組下標
void upAdjust(int low,int high){int i=high,j=i/2; //i為欲調整結點,j為其父親while(j>=low){//父親權值小于欲調整i的權值if(heap[j]>heap[i]){swap(heap[j],heap[i]);i=j;j=i/2;}else{break;}}
}//添加元素x
void insert(int x){heap[++n]=x; //讓元素個數加1,然后經數組末尾賦值為xupAdjust(1,n); //向上調整新加入的結點n
} ?
堆排序: void heapSort(){createHeap(); //建堆for(int i=n;i>1;i--){swap(heap[i],heap[1]);downAdjust(1,i-1);}
} ?
總結
以上是生活随笔為你收集整理的【堆】堆的基本操作总结的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。