二叉堆最核心的操作是上浮和下沉。
上浮是新增元素到隊尾元素,然後經過與上一級節點比較,將隊尾元素變動到合適的位置。
下沉是頭結點元素,跟左右葉子節點比較,下沉到合適位置。
簡單的**實現:
public static void buildupheap(int arr)
} public static void builddownheap(int arr)
} public static void downadjust(int arr, int parentinx, int length)
if (temp <= arr[childinx])
// 單邊賦值
arr[parentinx] = arr[childinx];
parentinx = childinx;
childinx = childinx * 2 + 1;
} arr[parentinx] = temp;
} public static void upadjust(int arr, int childinx)
arr[childinx] = temp;
}
1. delayedworkqueue
這個是在scheduledthreadpoolexecutor執行緒池排程執行器裡面,任務可延遲佇列的實現。內部存在siftup siftdown
2. priorityqueue priorityblockingqueue
2個優先順序佇列, 這邊不說明了
3. taskqueue
taskqueue 是早期定時任務timer中佇列的實現方法。內部存在 fixup fixdown
上述幾個對列,內部都是以二叉堆的方式實現的。雖然方法名稱不太一樣,但是實現邏輯大同小異。
1)比如topk問題。 從一億資料中找出排名前10的資料, 這個可以使用最小堆實現
2)堆排序, 二叉堆本身就是乙個有序的近似完全二叉堆
3)資料量小的場景。因為二叉堆,內部通過陣列實現。 如果父節點位置為n, 那麼子節點為2*n+1, 2*n+2, 如果n比較大,那麼很浪費儲存空間
二叉堆的應用
有乙個無序陣列,要求你找出陣列中第k大的元素。給定的無序陣列如下 75 153172 202419 128如果 k 6,也就是要尋找第6大的元素,這個元素是哪乙個呢?顯然,陣列中第一大的元素是24,第二大的元素是20,第三大的元素是17 第6大的元素是9。75 153172 202419 12843...
二叉樹應用 堆
本例中實現了最小堆的構造 插入 刪除。最小堆表示乙個非終端節點均不大於其左右孩子節點。最小堆用完全二叉樹表示,但是二叉樹存入一維陣列中。將完全二叉樹存入陣列,有一些性質。先將二叉樹從上到下,從左到右給每個節點編號0,1.n。那個乙個節點編號i,他的左孩子編號為2 i 1,右孩子編號2 i 2。完全二...
二叉堆的實現
include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...