最大堆最小堆的實現 C語言

2021-09-25 21:27:31 字數 2497 閱讀 3083

堆是特殊的佇列,從堆中取元素是按照元素的優先順序大小,而不是元素進入佇列的先後順序。因此,堆也通常被稱為「優先佇列」。

堆的最常用結構是用二叉樹表示,不特指的話,他是一棵完全二叉樹。因此通常不必用指標,而是用陣列來實現堆的儲存。我們

知道,完全二叉樹用陣列來表示,就相當於把全完二叉樹的層序遍歷依次存入陣列中,知道最後乙個節點。

需要注意的是,所用的陣列的起點為1,而不是0。這樣的目的是很容易能夠從父節點(i)找到子節點[ 2i ] [ 2i+1 ],反過來也很容易從子節點(j)找到父節點[ j/2 ]。 

堆的特性:

用陣列來表示完全二叉樹是堆的第一特性:堆的結構特性

相關性的不同決定了兩種不同的基本堆:最大堆(maxheap)(任一節點大於等於其子節點)和最小堆(minheap)(任一節點小於等於其子節點)。注意,兄弟節點之間沒有約束關係。

當我們需要小鍵值優先時,使用最小堆;需要大鍵值優先時,使用最大堆。

首先來看一下堆的一般結構體實現:

typedef struct hnode * heap;//結構體指標

struct hnode;

typedef heap maxheap; //定義乙個最大堆

typedef heap minheap; //定義乙個最小堆

建立:

//mheap表示maxheap或者minheap

mheap creatmheap(int size)

插入:

從新增的最後乙個節點的父節點開始,用要插入的元素向下過濾上層節點(比該元素小的下移)。

bool inserttoheap(maxheap heap, int x)

int i = ++heap->size;//新增的節點位置

for (; heap->data[i/2]x 迴圈就會停下來

heap->data[i] = heap->data[i/2];

}heap->data[i] = x;

return true;

}

刪除:

從根節點開始,用最大堆中的最後乙個元素向上過濾下層節點(比該元素大的上移)。

int deleteheap(maxheap heap)

int top = heap->data[1];//堆頂元素(最大)

int last = heap->size--;//取出陣列最後乙個元素

int parent = 1;

int child;

for (; parent*2<=heap->size; parent=child) else}}

heap->data[parent] = last;

return top;

}

構造:

雖說構造乙個最大堆時只要把乙個個元素按照插入方法插入到陣列中即可完成。但是其時間複雜度是(o(n log n))。我們有一種更簡單的方式,使得時間複雜度下降到o(n)。

1.將輸入的元素按順序放入完全二叉樹(陣列)中。

2.調整各個節點的位置,滿足最大堆的有序性。

調整的過程就是從最後乙個父節點開始倒序到根節點,逐一向下進行過濾操作(同刪除的向下過濾一樣,不過過濾元素就是父節點本身的元素)。

void percdown(maxheap heap, int n)else

heap->data[child] = heap->data[parent];}}

heap->data[parent] = top;

}void buildmaxheap(maxheap heap)

}

由於最大堆和最小堆只是元素的順序位置不同,具體的操作只是細節判斷的修改,就只提下插入和刪除操作把:

插入:

bool insertminheap(minheap heap, int x)

int p = ++heap->size;

for (; heap->data[p/2]data[p] = heap->data[p/2];

}heap->data[p] = x;

return true;

}

刪除:

int deletefromminheap(minheap heap)else}}

heap->data[parent] = last;

return top;

}

最小堆 最大堆的實現 c

最小堆 templateclass minheap int size const t min minheap insert const t x minheap deletemin t x void initialize t a,int size,int arraysize void deactiva...

c 實現最大堆和最小堆

堆是具有以下特性的完全二叉樹,每個結點的值都大於或等於其左右孩子結點的值,叫做最大堆 每個結點的值都小於或等於其左右孩子結點的值,叫做最小堆。vector int nums 1 如果使用nums構建最大堆 make heap nums.begin nums.end 或 make heap nums....

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...