堆的定義、特點及實現
1 堆的定義
一棵完全二叉樹的陣列物件。
2 堆的特點
- 是完全二叉樹;
- 用陣列實現:將二叉樹的結點按層級順序放入陣列,根節點在位置1,它的子節點在位置2和3,子節點的子節點在4、5、6、7,以此類推;
- 由2可知:如果一個結點位置為k,則其父節點位置為k/2,其兩個子節點的位置分別為2k和2k+1。因此,從a[k]向上一層,令k=k/2,向下一層令k=2k或2k+1;
- 每個結點大於等於它的兩個子結點。
3 Java實現
public class Heap<T extends Comparable<T>> {
//儲存堆中的元素
private T[] items;
//記錄堆中元素的個數
private int N;
public Heap(int capacity) {
this.items= (T[])new Comparable[capacity+1];
this.N=0;
}
//往堆中插入一個元素
public void insert(T t){
items[++N]=t;
swim(N);
}
//使用上浮演算法,使索引k處的元素能在堆中處於一個正確的位置
private void swim(int k){
//通過迴圈,不斷的比較當前結點的值和其父結點的值,如果發現父結點的值比當前結點的值小,則交換位置
while(k>1){
//比較當前結點和其父結點
if (less(k/2,k)){
exch(k/2,k);
}else {
break;
}
k = k/2;
}
}
//刪除堆中最大的元素,並返回這個最大元素
public T delMax(){
T max = items[1];
//交換索引1處的元素和最大索引處的元素,讓完全二叉樹中最右側的元素變為臨時根結點
exch(1,N);
//最大索引處的元素刪除掉
items[N]=null;
//元素個數-1
N--;
//通過下沉調整堆,讓堆重新有序
sink(1);
return max;
}
//使用下沉演算法,使索引k處的元素能在堆中處於一個正確的位置
private void sink(int k){
//通過迴圈不斷的對比當前k結點和其左子結點2*k以及右子結點2k+1處中的較大值的元素大小,如果當前結點小,則需要交換位置
while(2*k<=N){
//獲取當前結點的子結點中的較大結點
int max;//記錄較大結點所在的索引
if (2*k+1<=N){
if (less(2*k,2*k+1)){
max=2*k+1;
}else{
max=2*k;
}
}else {
max = 2*k;
}
//比較當前結點和較大結點的值
if (!less(k,max)){
break;
}
//交換k索引處的值和max索引處的值
exch(k,max);
//變換k的值
k = max;
}
}
//判斷堆中索引i處的元素是否小於索引j處的元素
private boolean less(int i,int j){
return items[i].compareTo(items[j])<0;
}
//交換堆中i索引和j索引處的值
private void exch(int i,int j){
T temp = items[i];
items[i] = items[j];
items[j] = temp;
}
public static void main(String[] args) {
Heap<String> heap = new Heap<>(20);
heap.insert("A");
heap.insert("B");
heap.insert("C");
heap.insert("D");
heap.insert("E");
heap.insert("F");
heap.insert("G");
String del;
while((del=heap.delMax())!=null){
System.out.print(del+",");
}
}
}
G,F,E,D,C,B,A,
相關文章
- 分散式資料庫的定義和特點分散式資料庫
- 解讀雲端計算的定義和特點
- JVM 堆的定義與詳解JVM
- 公鏈開發特點優缺點分析及前端實現前端
- 堆和索引堆的python實現索引Python
- 虛擬主持人常見的兩種實現形式及特點
- PHP 單例模式優點意義及如何實現PHP單例模式
- 展廳中控系統的含義及應用特點展示
- AnalyticDB實現和特點淺析
- 堆的原理與實現
- 介面的定義和實現
- 簡單理解JSONP的定義及其實現JSON
- nginx 特點及安裝Nginx
- 大頂堆的python實現Python
- PHP 實現堆, 堆排序以及索引堆PHP排序索引
- Kotlin的特點及各版本新特性Kotlin
- JAVA陣列的定義及用法Java陣列
- 堆的原理以及實現O(lgn)
- Mybatis實現分包定義資料庫MyBatis資料庫
- dolphinscheduler簡單任務定義及複雜的跨節點傳參
- mybatis實現變數定義,實現sql業務程式碼MyBatis變數SQL
- 淺談多型機制的意義及實現多型
- 機器視覺原理及特點視覺
- Hbase一:Hbase介紹及特點
- java特點了解及JDK初談JavaJDK
- DIY 實現 ThinkPHP 核心框架(七)定義框架PHP框架
- 《甘十九妹》 ent 實現之 Schema 定義
- Linux中chmod命令的定義及作用!Linux
- 樹的定義及相關術語
- Python Lambda表示式的作用及定義Python
- 4.16 實現自己的堆管理器
- CSS如何設定不可點選?CSS如何設定不可點選的實現方法CSS
- 高併發架構系列:分散式鎖的由來、特點及Redis分散式鎖的實現詳解架構分散式Redis
- 使用者自定義定時任務的php實現PHP
- 服裝製鞋業的特點及管理(轉)
- 深度學習中的框架特點及介紹深度學習框架
- 互動滑軌屏的特點及功能特性
- 沉浸式投影的應用特點及優勢