国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

基于堆的基本操作的介紹

2020-01-26 16:16:41
字體:
來源:轉載
供稿:網友

  我們期望的數據結構能支持插入操作,并能方便地從中取出具有最小或最大關鍵碼的記錄,這樣的數據結構即為優先級隊列。在優先級隊列的各種實現中,堆是最高效的一種數據結構。
  最小堆:任一結點的關鍵碼均小于或等于它的左右子女的關鍵碼,位于堆頂的結點的關鍵碼是整個元素集合的最小的,所以稱它為最小堆。最大堆類似定義。

  創建堆:采用從下向上逐步調整形成堆得方法來創建堆。為下面的分支結點調用下調算法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;

 
 

}

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

圖片精選

主站蜘蛛池模板: 肇东市| 林芝县| 兰坪| 株洲市| 乡城县| 闽侯县| 阿尔山市| 秦皇岛市| 平邑县| 隆子县| 韩城市| 个旧市| 凤翔县| 万宁市| 三明市| 怀柔区| 泽库县| 股票| 蒙自县| 兴化市| 靖宇县| 康定县| 阿拉善盟| 兴仁县| 定远县| 白玉县| 永兴县| 建瓯市| 永和县| 瓦房店市| 益阳市| 西乌珠穆沁旗| 汉阴县| 江孜县| 南阳市| 扎鲁特旗| 息烽县| 镇巴县| 新龙县| 息烽县| 镇巴县|