堆可以看作是一棵完全二叉樹,除最後一層外,每一層都是填滿的,最後一層從左到右依次填入
在堆上,對任意乙個結點來說,越接近頂部,權值就越大(一般指大頂堆),並且它的權值大於等於它所在子樹所有點的權值
我們把根結點權值大於等於樹中結點權值的稱為大根堆,小於等於樹種結點權值的稱為小根堆
下圖就是乙個大根堆的示意圖
就如上述大頂堆示意圖一樣,我們可以用乙個陣列來維護大根堆
堆具有的性質叫做堆序性,每次插入或者刪除新元素,我們都要通過相應演算法對堆序性進行維護
堆的建立很簡單,只需定義乙個陣列並用乙個整數儲存它的大小就可以了
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 自下而上的下...
堆(資料結構)及堆排序
這裡的堆是指一種資料結構 或資料結構屬性 非指堆記憶體。堆屬性用二叉樹來體現,具堆屬性的資料結構才可被叫做為堆。具堆屬性的資料結構滿足以下筆記的 順序 和 形狀 兩個條件。將某資料結構如陣列,將陣列的元素依次安排在二叉樹中的根結點 根結點的左孩子 根結點的右孩子位置之上,再將剩餘元素依次安排在根結點...