資料結構 堆以及堆排序

2021-08-09 14:33:11 字數 2793 閱讀 3842

堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入

在堆上,對任意乙個結點來說,越接近頂部,權值就越大(一般指大頂堆),並且它的權值大於等於它所在子樹所有點的權值

我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆

下圖就是乙個大根堆的示意圖

就如上述大頂堆示意圖一樣,我們可以用乙個陣列來維護大根堆

堆具有的性質叫做堆序性,每次插入或者刪除新元素,我們都要通過相應演算法對堆序性進行維護

堆的建立很簡單,只需定義乙個陣列並用乙個整數儲存它的大小就可以了

templateclass heap 

~heap()

};

下面開始介紹堆中相應的各種演算法:

堆的相應插入演算法如下:

1.把新元素儲存到陣列的最後

2.找到新元素父節點的位置,比較大小

3.如果是大頂堆且該元素大於父結點,交換之,如果是小頂堆且該元素小於父節點,交換之

4.迴圈比較,直到該節點的父節點與其的大小滿足堆序性

比如我們要在這個小頂堆中插入新元素7,先將7放入到堆的尾部,然後將7與其父節點11比較,7小於11,不滿足堆序性,交換兩者

再與其父節點10比較,依然不滿足堆序性,交換之,再與其父節點4比較,此時滿足堆序性,操作結束

大頂堆也執行相應類似的操作

templatevoid heap::push(type value)

size = size + 1;

}

堆的維護演算法:我們刪除堆或者進行堆排序的話,我們每一次操作過後都需要乙個演算法來維護堆序列性

1.從根結點開始,分別與其左右子中最大的(大頂堆)或最小的(小頂堆)元素進行比較

2.如果不滿足堆序性,則與該子節點進行交換

3.再與下兩個子節點進行比較,直到該節點和其子節點滿足堆序性或該節點為葉子節點

下面有兩種實現演算法供參考(遞迴型和非遞迴型的)

遞迴型

templatevoid heap::updata(int pos, int n)

if (rchild < n && data[max_pos] < data[rchild])

if (max_pos != pos)

}

非遞迴型

void downadjust(int low, int high) 

//將子節點與當前結點進行比較,觀察是否滿足堆序性

if (heap[lchild] > heap[current])

else

}}

堆的刪除演算法:1.將堆頂元素與最後乙個元素交換

2.刪除堆頂(現在是最後乙個元素)

3.呼叫調整演算法

templatevoid heap::popt()

堆排序:將堆頂元素依次與堆中的元素交換位置,然後對堆頂元素和交換位置的元素的前乙個元素進行調整即可

templatevoid heap::heap_sort()

整體實現**如下:

#include #include using namespace std;

// 請在下面實現堆類 heap

templateclass heap

~heap()

void push(type value);

void output();

type top(); //輸出棧頂元素

void popt(); //彈出棧頂元素

void heap_sort(); //堆排序

};templatevoid heap::popt()

//輸出棧頂元素

templatetype heap::top()

templatevoid heap::push(type value)

size = size + 1;

}templatevoid heap::output()

cout << endl;

}templatevoid heap::updata(int pos, int n)

if (rchild < n && data[max_pos] < data[rchild])

if (max_pos != pos)

}templatevoid heap::heap_sort()

}int main() ;

heapheap(100);

for (int i = 0; i < 10; i++)

heap.output();

cout << heap.top() << endl;

heap.popt();

heap.output();

heap.heap_sort();

heap.output();

system("pause");

return 0;

}

資料結構 堆以及堆排序

首先要明確一點,堆並不是我們直接寫好的,是需要建立堆,即根據一種演算法,把不是堆的一組資料變成大根堆或者小根堆,還是上述的圖我們可以知道這個堆的順序是100,90,85,72,71,65,79,52,56,45,58。當然,這個堆的順序存在多個,只要滿足根節點和孩子節點之間的關係就行,所以堆不是唯一...

資料結構堆以及堆排序的要點

1 堆 堆的重要性質 任意節點的值總是大於等於 或者小於等於 子節點的值 2 二叉堆 二叉堆的邏輯結構是乙個完全二叉樹 也叫完全二叉堆 鑑於完全二叉樹的一些特性,二叉堆的底層 物理結構 一般用陣列實現 索引 i 的規律,n是元素的數量 3 最大堆的建立 兩種方式 1 自上而下的上慮 2 自下而上的下...

堆(資料結構)及堆排序

這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...