亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言實(shí)現(xiàn)大頂堆的示例代碼

 更新時(shí)間:2022年07月22日 08:57:43   作者:MT_125  
最大堆,又稱大根堆(大頂堆)是指根結(jié)點(diǎn)(亦稱為堆頂)的關(guān)鍵字是堆里所有結(jié)點(diǎn)關(guān)鍵字中最大者,屬于二叉堆的兩種形式之一。本文將用C語言實(shí)現(xiàn)大頂堆,感興趣的可以了解一下

堆的實(shí)現(xiàn)

1.堆結(jié)構(gòu)

邏輯結(jié)構(gòu)上類似于 一棵 “樹”

2.堆的種類

大頂堆結(jié)構(gòu): 一種特殊的樹:其每個(gè)子節(jié)點(diǎn)均比母節(jié)點(diǎn)要小

小頂堆結(jié)構(gòu): 同理:其每個(gè)子節(jié)點(diǎn)均比母節(jié)點(diǎn)要大

結(jié)構(gòu)圖示:

3.大頂堆代碼實(shí)現(xiàn)

這里實(shí)現(xiàn)堆 用循序表的方式

①初始化:

typedef int Heaptype;
 
typedef struct Heap
{
    Heaptype* head;   
    int size;         //記錄堆總?cè)萘?
    int capacity;     //記錄當(dāng)前數(shù)據(jù)總個(gè)數(shù)
}Heap;
 
//堆的初始化
void Heap_Init(Heap* pphead)
{
    assert(pphead);
    pphead->head = NULL;
    pphead->size = 0;
    pphead->capacity = 0;
}

②插入數(shù)據(jù):

實(shí)現(xiàn)細(xì)節(jié):數(shù)據(jù)在插入的同時(shí),要進(jìn)行數(shù)據(jù)結(jié)構(gòu)的調(diào)整,使樹頂始終保持最大數(shù)

如果新插入節(jié)點(diǎn)比母節(jié)點(diǎn)大的話,要進(jìn)行交換 ,因此將這個(gè)調(diào)整結(jié)構(gòu)的環(huán)節(jié)獨(dú)立出來

即:“向上調(diào)整”。

 向上調(diào)整:因?yàn)椴迦霐?shù)據(jù)時(shí):新數(shù)據(jù)默認(rèn)儲(chǔ)存在順序表尾,因此其邏輯上是在堆的底部,

所以,當(dāng)新數(shù)據(jù)比母節(jié)點(diǎn)大時(shí),它將與邏輯上處于其上方的母節(jié)點(diǎn)交換,稱為

向上調(diào)整。

注:向上調(diào)整有時(shí)不止調(diào)整一次 ,還有可能調(diào)整多次,直到每個(gè)節(jié)點(diǎn)都在其相應(yīng)位置 。

流程圖解:

大頂堆插入流程

細(xì)節(jié)點(diǎn):因?yàn)閿?shù)據(jù)是以順序表的方式儲(chǔ)存,所以子節(jié)點(diǎn)的下標(biāo)與母節(jié)點(diǎn)的下標(biāo)符合

公式:parent = (child - 1)/2 ;(按照此公式帶入計(jì)算就理解了) 

//向上調(diào)整
void adjust_up(Heap* pphead)
{
    int child = pphead->capacity;
    int parent = (child - 1) / 2;
    for (; pphead->head[parent] < pphead->head[child];)//判斷是否符合大頂堆
    {
        swap(&(pphead->head[parent]),&(pphead->head[child]));//進(jìn)行交換
        child = parent;
        parent = (child - 1) / 2;
    }
}
 
//插入數(shù)據(jù)
void Heap_push(Heap* pphead, Heaptype data)
{
    assert(pphead);
    //判斷是否滿容量并擴(kuò)容
    Heap_realloc(pphead);
    pphead->head[pphead->capacity] = data;
    //向上調(diào)整
    adjust_up(pphead);
    pphead->capacity++;
}

③刪除數(shù)據(jù):為了避免因?yàn)橹苯觿h除頭部數(shù)據(jù)導(dǎo)致整個(gè)堆的結(jié)構(gòu)打亂,

這里先將頭部數(shù)據(jù)與尾數(shù)據(jù)交換,然后將尾部數(shù)據(jù)刪除,接著使用“向下調(diào)整”,即:將換上來的頂部數(shù)據(jù)向下與其子節(jié)點(diǎn)比較調(diào)整,直至符合大頂堆結(jié)構(gòu)為止。

注:1.大頂堆向下調(diào)整時(shí),母節(jié)點(diǎn)要與兩個(gè)子節(jié)點(diǎn)中較大的一個(gè)交換 ,因此要比較一下。

2.這里下標(biāo)的計(jì)算公式為:左孩子:child = (parent * 2) + 1

右孩子:child = (parent * 2) + 2

3.計(jì)算孩子下標(biāo)時(shí)要避免越界,避免將母節(jié)點(diǎn)與不屬于堆中的數(shù)據(jù)比較。

//刪除數(shù)據(jù)
void Heap_pop(Heap* pphead)
{
    assert(pphead);
    assert(pphead->capacity > 0);      //防止堆為空
    //將頂部數(shù)據(jù)與尾部數(shù)據(jù)交換
    swap(&(pphead->head[0]),&( pphead->head[pphead->capacity-1]));
    pphead->capacity--;
    //向下調(diào)整
    adjust_down(pphead,0);
}
 
//向下調(diào)整
void Adjust_down(int* a, int size, int parent)
{
    assert(a);
    for (int child = parent * 2 + 1; child <= size; child = parent * 2 + 1)
    {
        //默認(rèn)用左孩紙與母節(jié)點(diǎn)比較,如果右孩紙比左孩紙大且不越界則交換
        if (a[child] > a[child + 1] && child + 1 <= size)
            child = child + 1;
        //比較孩紙和母節(jié)點(diǎn)
        if (a[child] < a[parent])
        {
            int temp = a[child];
            a[child] = a[parent];
            a[parent] = temp;
        }
        //向下繼續(xù)比較
        parent = child;
    }
}

④擴(kuò)容 || 判空 || 取頂數(shù)據(jù) || 銷毀堆

//判斷是否擴(kuò)容
void Heap_realloc(Heap* pphead)
{
    assert(pphead);
    if (pphead->size == pphead->capacity)
    {
        Heaptype Newsize = (pphead->size == 0) ? 4 : (pphead->size * 2);
        Heaptype* Newhead = (Heaptype*)realloc(pphead->head,sizeof(Heaptype) * Newsize);
        if (Newhead == NULL)
        {
            perror("realloc");
            exit(-1);
        }
        pphead->head = Newhead;
        pphead->size = Newsize;
    }
}
 
//判斷堆是否為空
bool Heap_Empty(Heap* pphead)
{
    if (pphead->capacity)
        return false;
    return true;
}
//取對(duì)頂數(shù)據(jù)
Heaptype Heap_top(Heap* pphead)
{
    return pphead->head[0];
}
//銷毀堆
void Heap_Destory(Heap* pphead)
{
    assert(pphead);
    free(pphead->head);
    pphead->head = NULL;
    pphead->size = 0;
    pphead->capacity = 0;
}

以上就是C語言實(shí)現(xiàn)大頂堆的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語言大頂堆的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ WideCharToMultiByte()函數(shù)案例詳解

    C++ WideCharToMultiByte()函數(shù)案例詳解

    這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++作用域與函數(shù)重載的實(shí)現(xiàn)

    C++作用域與函數(shù)重載的實(shí)現(xiàn)

    本文主要介紹了C++作用域與函數(shù)重載的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 實(shí)現(xiàn)一個(gè)random?shuffle算法示例

    實(shí)現(xiàn)一個(gè)random?shuffle算法示例

    這篇文章主要為大家介紹了實(shí)現(xiàn)一個(gè)random?shuffle算法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • STL各個(gè)容器性能詳細(xì)比較

    STL各個(gè)容器性能詳細(xì)比較

    從下面表中的數(shù)據(jù)來看寫入用時(shí)vector和deque很快,因?yàn)樗麄儍?nèi)存分配次數(shù)少,關(guān)聯(lián)容器和list都是一個(gè)一個(gè)分配的,一個(gè)一個(gè)分配也會(huì)造成內(nèi)存碎片,內(nèi)存利用率低
    2013-09-09
  • VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例

    VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例

    這篇文章主要介紹了VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • 解析c中stdout與stderr容易忽視的一些細(xì)節(jié)

    解析c中stdout與stderr容易忽視的一些細(xì)節(jié)

    本篇文章是對(duì)在c語言中stdout與stderr容易忽視的一些細(xì)節(jié)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++深入分析講解類的知識(shí)點(diǎn)

    C++深入分析講解類的知識(shí)點(diǎn)

    C++類,是指系統(tǒng)在第一次在程序中遇到一個(gè)類時(shí)為這個(gè)類建立它的所有類變量的拷貝 - 這個(gè)類的所有實(shí)例共享它的類變量
    2022-06-06
  • VSCode與Keil聯(lián)合開發(fā)STM32的流程

    VSCode與Keil聯(lián)合開發(fā)STM32的流程

    這篇文章主要介紹了VSCode與Keil聯(lián)合開發(fā)STM32的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++ float、double判斷是否等于0問題

    C++ float、double判斷是否等于0問題

    這篇文章主要介紹了C++ float、double判斷是否等于0問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C++依賴倒轉(zhuǎn)原則和里氏代換原則有什么好處

    C++依賴倒轉(zhuǎn)原則和里氏代換原則有什么好處

    設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設(shè)計(jì)模式七大原則之一的依賴倒轉(zhuǎn)原則
    2023-02-02

最新評(píng)論