維護一種數據結構,它能夠完成下面兩個功能:插入數據;取出最小數據。java
由於數組和鏈表均不能均衡這兩個功能的時間複雜度。因而採用徹底二叉樹來實現這兩種功能。數組
小堆,每一個節點值都小於其子節點的值。數據結構
其實,就有點像排行榜的感受,當有新的元素登上排行榜的時候,將會去除最後一名的元素,新加入的元素存儲在相應的位置。code
只不過這個排行榜是用二叉樹堆實現的,這個二叉樹堆也不想二叉搜索樹那樣徹底有序。其只要求父節點小於子節點就能夠。排序
由於二叉樹堆的特性,能夠利用數組結構進行實現。隊列
利用堆排序能夠完成Top k問題,就像排行榜同樣。it
由於二叉樹堆,更像是數據結構,因此這裏不去實現其具體的結構,而是使用Java中實現的優先隊列,PriorityQueue。io
import java.util.Arrays; import java.util.PriorityQueue; public class HeapSort { public static void main(String[] args) { int[] nums = {5, 7, 2, 4, 1, 6, 8, 9}; heapSort(nums); System.out.println(Arrays.toString(nums)); } public static void heapSort(int[] nums){ PriorityQueue<Integer> heap = new PriorityQueue<>(); for(int i = 0; i < nums.length; i++){ heap.offer(nums[i]); } for (int i = 0; i < nums.length; i++) { nums[i] = heap.poll(); } } }
堆排序的時間複雜度,在於:插入和去除元素後,對堆的維護,時間複雜度爲NlogN。class
空間複雜度爲O(n)import