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