思想
維護一種數據結構,它可以完成下面兩個功能:插入數據;取出最小數據。
因爲數組和鏈表均不能均衡這兩個功能的時間複雜度。於是採用完全二叉樹來實現這兩種功能。
小堆,每個節點值都小於其子節點的值。
其實,就有點像排行榜的感覺,當有新的元素登上排行榜的時候,將會去除最後一名的元素,新加入的元素存儲在相應的位置。
只不過這個排行榜是用二叉樹堆實現的,這個二叉樹堆也不想二叉搜索樹那樣完全有序。其只要求父節點小於子節點就可以。
因爲二叉樹堆的特性,可以利用數組結構進行實現。
利用堆排序可以完成Top k問題,就像排行榜一樣。
因爲二叉樹堆,更像是數據結構,所以這裏不去實現其具體的結構,而是使用Java中實現的優先隊列,PriorityQueue。
實現
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。
空間複雜度爲O(n)