麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

詳解基于堆的基本操作

2020-02-24 14:32:14
字體:
來源:轉載
供稿:網友

  我們想的數據結構是可以支持插入操作并可以方便取出具有最小或最大關鍵碼的記錄,而堆是最高效的一種數據結構,現在我們就跟武林小編一起詳解基于堆的基本操作吧。
  最小堆:任一結點的關鍵碼均小于或等于它的左右子女的關鍵碼,位于堆頂的結點的關鍵碼是整個元素集合的最小的,所以稱它為最小堆。最大堆類似定義。

  創建堆:采用從下向上逐步調整形成堆得方法來創建堆。為下面的分支結點調用下調算法siftDown,將以它們為根的子樹調整為最小堆。從局部到整體,將最小堆逐步擴大,直到將整個樹調整為最小堆。

  插入一個元素:最小堆的插入算法調用了另一種堆得調整方法siftUp,實現自下而上的上滑調整。因為每次新結點總是插在已經建成的最小堆后面,這時必須遵守與sift相反的比較路徑,從下向上,與父結點的關鍵碼進行比較,對調。

  刪除一個元素:從最小堆刪除具有最小關鍵碼記錄的操作時將最小堆的堆頂元素,即其完全二叉樹的順序表示的第0號元素刪去,去把這個元素取走后,一般以堆得最后一個結點填補取走的堆頂元素,并將堆的實際元素個數減1.但是用最后一個元素取代堆頂元素將破壞堆,需要調用siftDown算法進行調整堆。

本文代碼均以最小堆的實現為例。

?

#include<iostream>
#include<assert.h>
usingnamespace std;

?

constint maxheapsize=100;
staticint currentsize=0;

//從上到下調整堆
void siftDown(int* heap,int currentPos,int m)
{
??? int i=currentPos;
??? int j=currentPos*2+1;//i's leftChild
int temp=heap[i];
??? while(j<=m)
??? {
??????? if(j<m&&heap[j]>heap[j+1]) j++;// j points to minChild
if(temp<=heap[j]) break;
??????? else
??????? {
??????????? heap[i]=heap[j];
??????????? i=j;
??????????? j=2*i+1;
??????? }
??? }
??? heap[i]=temp;
}

//從下向上調整堆
void siftUp(int* heap, int start)
{
??? int i=start,j=(i-1)/2;
??? int temp=heap[i];

??? while(i>0)
??? {
??????? if(heap[j]>temp)
??????? {
??????????? heap[i]=heap[j];
??????????? i=j;
??????????? j=(i-1)/2;
??????? }
??????? elsebreak;
??? }
??? heap[i]=temp;
}

//構建堆
int* Heap(int*arr, int size)
{
??? int i;
??? currentsize=size;
??? int* heap =newint[maxheapsize];
??? assert(heap!=NULL);
??? for(i=0;i<currentsize;i++) heap[i]=arr[i];
??? int currentPos=(currentsize-2)/2;
??? while(currentPos>=0)
??? {
??????? siftDown(heap,currentPos,currentsize-1);
??????? currentPos--;
??? }
??? return heap;
}


//增加一個元素
void insert(int* heap,int value)
{
??? if(currentsize>=maxheapsize)
??? {
??????? cout<<"Heap is full!"<<endl;
??????? return ;
??? }
??? heap[currentsize]=value;
??? siftUp(heap,currentsize);
??? currentsize++;
}

//刪除一個元素,并返回刪除前的堆頂元素
int removemin(int* heap)
{
??? assert(currentsize>=0);
??? int removeValue=heap[0];
??? heap[0]=heap[currentsize-1];
??? currentsize--;
??? siftDown(heap,0,currentsize-1);
??? return removeValue;
}

int main()
{
??? constint size=10;
??? int arr[size]={2,1,3,0,8,1,6,9,7,10};
??? int* heap=Heap(arr,size);
??? //堆排序
for(int i=0;i<size;i++)
??? {
??????? arr[i]=removemin(heap);
??????? cout<<arr[i]<<endl;
??? }
??? delete []heap;
??? return0;

?
?

}

  以上就是武林小編為你詳解基于堆的基本操作,希望大家喜歡,更多相關內容請繼續關注武林技術頻道

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 中文字幕在线观看视频一区 | 亚州欧美在线 | 亚洲一区二区在线视频 | 视频一区二区中文字幕 | 国产91九色 | 91麻豆精品国产91久久久无需广告 | 少妇色诱麻豆色哟哟 | 国产中文99视频在线观看 | 香蕉视频破解 | 一级毛片手机在线观看 | 国产日韩a | 国产视频在线观看一区二区三区 | 91超在线| 国产亚洲欧美在线视频 | 国产精品久久久久久久av三级 | 黄色电影免费网址 | 久草导航| 宅男视频在线观看免费 | 男人的天堂视频网站 | 免费黄色短视频网站 | 亚洲va国产va | 久草在线视频中文 | 中国a毛片 | 一级成人在线 | 国产超碰人人做人人爱ⅴa 国产精品久久久久久久hd | 婷婷亚洲一区二区三区 | 草久影院 | 成人在线a| 狠狠干最新网址 | 日韩一级电影在线观看 | 神秘电影91 | 天天草夜夜 | 黄色毛片视频在线观看 | 国产精品免费在线 | 成人福利视频在 | 久久精精品 | 线观看免费完整aaa 一二区成人影院电影网 | 欧美一级全黄 | 午夜视频在线观看91 | 一级片久久免费 | 欧美成人精品一区二区三区 |