最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于堆的基本操作的介紹

 更新時間:2013年05月07日 11:23:03   作者:  
本篇文章對堆的基本操作進行了詳細的分析介紹。需要的朋友參考下

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

  創(chuàng)建堆:采用從下向上逐步調整形成堆得方法來創(chuàng)建堆。為下面的分支結點調用下調算法siftDown,將以它們?yōu)楦淖訕湔{整為最小堆。從局部到整體,將最小堆逐步擴大,直到將整個樹調整為最小堆。

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

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

本文代碼均以最小堆的實現(xiàn)為例。

復制代碼 代碼如下:

#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;

 
 

}

相關文章

  • C++設計模式迪米特法則實例

    C++設計模式迪米特法則實例

    這篇文章主要為大家詳細介紹了C++設計模式迪米特法則實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C、C++線性表基本操作的詳細介紹

    C、C++線性表基本操作的詳細介紹

    這篇文章主要給大家介紹了關于C、C++線性表基本操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • C/C++利用原生套接字抓取FTP數(shù)據包

    C/C++利用原生套接字抓取FTP數(shù)據包

    這篇文章主要為大家詳細介紹了如何基于原始套接字的網絡數(shù)據包捕獲與分析工具,通過實時監(jiān)控網絡流量,實現(xiàn)抓取流量包內的FTP通信數(shù)據,需要的小伙伴可以參考下
    2023-12-12
  • 基于C語言實現(xiàn)簡易三子棋游戲

    基于C語言實現(xiàn)簡易三子棋游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)簡易三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • Qt中QSettings配置文件的讀寫和應用場景詳解

    Qt中QSettings配置文件的讀寫和應用場景詳解

    這篇文章主要給大家介紹了關于Qt中QSettings配置文件的讀寫和應用場景的相關資料,QSettings能讀寫配置文件,當配置文件不存在時,可生成配置文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 給C語言初學者的學習建議

    給C語言初學者的學習建議

    在本篇文章里小編給大家分享的是關于C語言學習建議的相關內容,有興趣的朋友們可以學習參考下。
    2020-06-06
  • C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    C語言函數(shù)棧幀的創(chuàng)建與銷毀詳解

    函數(shù)棧幀(stack frame)就是函數(shù)調用過程中在程序的調用棧(call stack)所開辟的空間,下面這篇文章主要給大家介紹了關于C語言函數(shù)棧幀的創(chuàng)建與銷毀的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 純C語言:貪心Prim算法生成樹問題源碼分享

    純C語言:貪心Prim算法生成樹問題源碼分享

    這篇文章主要介紹了貪心Prim算法生成樹問題源碼,有需要的朋友可以參考一下
    2014-01-01
  • C語言中strcmp的實現(xiàn)原型

    C語言中strcmp的實現(xiàn)原型

    這篇文章主要介紹了C語言中strcmp的實現(xiàn)原型的相關資料,這里提供實例幫助大家理解這部分內容,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • C語言操作符超詳細講解上篇

    C語言操作符超詳細講解上篇

    C?語言提供了豐富的操作符,有:算術操作符,移位操作符,位操作符,賦值操作符,單目操作符,關系操作符,邏輯操作符,條件操作符等。因為篇幅過大將分兩篇講解,讓我們通讀本篇來詳細了解吧
    2022-04-04

最新評論

弥勒县| 茂名市| 九龙坡区| 凤台县| 称多县| 兴仁县| 阜南县| 岐山县| 平罗县| 鄂托克前旗| 翼城县| 江阴市| 会同县| 澜沧| 奎屯市| 体育| 西安市| 武城县| 仁布县| 定边县| 林州市| 黄梅县| 高碑店市| 灵川县| 黎平县| 吕梁市| 中宁县| 宜春市| 七台河市| 天全县| 杨浦区| 雅安市| 绥棱县| 张家港市| 乌恰县| 沅陵县| 青龙| 正阳县| 边坝县| 固镇县| 绥宁县|