5. 堆排序

思想

維護一種數據結構,它可以完成下面兩個功能:插入數據;取出最小數據。

因爲數組和鏈表均不能均衡這兩個功能的時間複雜度。於是採用完全二叉樹來實現這兩種功能。

小堆,每個節點值都小於其子節點的值。

其實,就有點像排行榜的感覺,當有新的元素登上排行榜的時候,將會去除最後一名的元素,新加入的元素存儲在相應的位置。

只不過這個排行榜是用二叉樹堆實現的,這個二叉樹堆也不想二叉搜索樹那樣完全有序。其只要求父節點小於子節點就可以。

因爲二叉樹堆的特性,可以利用數組結構進行實現。

利用堆排序可以完成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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章