5. 堆排序

思想

維護一種數據結構,它能夠完成下面兩個功能:插入數據;取出最小數據。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

相關文章
相關標籤/搜索