堆是一種數據結構,分爲最小堆和最大堆,能夠用二叉樹來表示。數據結構
在二叉樹的任意的一個三角結構中(一個父節點,兩個子節點),須要知足如下兩個條件:spa
一、父節點要是最小的,就是最小堆(或最大的,就是最大堆),兩個子節點之間沒有要求blog
二、數據插入的順序是一層一層的,只有上一層存滿,纔會有下一層排序
下面咱們以圖片的形式演示最小堆的插入、取值、和排序操做,只要知道最小堆的原理,那麼最大堆也就明白了。圖片
假設咱們有一個原始的最小堆以下:原理
當插入一個新值時,首先將值放到樹的最後的位置,以下圖所示。二叉樹
而後將這個值與父元素比較,若是不知足規則1,則與父元素替換(以下圖所示)。im
第一步數據
第二步db
第三步
由圖可知,在插入操做中,交換次數最大即爲樹的高度(log n)
在最小堆中,拿出一個最小值,固然就是拿出第一個數啦~不過拿完之後樹不就沒有「頭」了?
不用擔憂,咱們能夠把最後一個數放到頭的位置,這樣樹的結構就不會改變,並且操做簡單(由於是最後一個數)。
固然,由於是最後一個數,必然會出現不知足條件1的狀況,因此咱們須要把新的樹頭與子元素比較替換,下面是圖片演示:
假設咱們有一個原始的最小堆以下所示,接下來咱們要取最小值:
不過交換完極可能是不知足條件1的,那麼咱們就須要比較替換,替換規則是和兩個子元素中最小的一個替換
由圖可知,在取值操做中,交換次數最大也爲樹的高度(log n)
咱們知道了如何取最小值,那麼堆的排序簡單啦~只要依次取堆的最小值,那麼當堆取完時,咱們取出的數據不就是一個從小到大的序列嘛!