利用堆這種資料結構進行排序的一種演算法,它是選擇排序的一種。
我們可以把堆看成一棵完全二叉樹,這棵完全二叉樹滿足:
大堆:每個節點的值大於等於孩子節點的堆)
小堆:每個節點的值小於等於孩子節點的堆
代表堆的完全二叉樹的根結點的值是最值的,也是陣列的第乙個元素,將乙個無序序列調整為乙個堆,就可以找出這個序列的最值,然後將找出的這個最大值交換到序列的最後(或最前),這樣有序序列關鍵字增加1個,無序序列關鍵字減少1個,對新的無序序列重複這樣的操作,就實現了排序。
注意:堆排序中最關鍵的操作是將序列調整為堆,整個排序的過程就是通過不斷調整,使得不符合堆定義的完全二叉樹變為符合堆定義的完全二叉樹。
堆的儲存結構:
記憶體結構:
**實現:
//堆化
void
heapify
(int a,
int size,
int index)
max = a[left]
>= a[right]
? left : right;
if(a[index]
>= a[max]
)else
}
//建堆
intcreatheap
(int a,
int size)
}void
heapsort
(int a,
int size)
}
堆排序的特性總結:堆排序使用堆來選數,效率就高了很多時間複雜度:o(n*logn)
空間複雜度:o(1)
穩定性:不穩定
排序之堆排序
堆排序是一種基於比較排序的另一種排序演算法,它採用了一種近似完全二叉樹的二叉堆資料結構。演算法實現相容了插入排序的空間原址性 即只需要有限個額外的儲存空間 和歸併排序的優良時間複雜度。偽 如下 heapsort a build max heap a for i a.length downto 2 e...
排序之堆排序
這裡沒有對0號元素進行排序 堆排 public class heap public static void exec comparable array,int i,int j 下沉 private static void sink comparable array,int k,int n publi...
排序之堆排序
堆其實是一種完全二叉樹,從上到下從左到右,大頂堆的父節點大於其左右子節點,小頂堆的父節點小於其左右子節點 1 首先是進行heapify,建立堆 2 從下到上,從右到左的進行heapify構建有序的堆 3 進行排序,將堆頂父節點和底層最右邊的子節點互換,然後不斷重複以上步驟 1 heapify def...