堆 排 序 html
堆排序。就是經過堆結構來排序。能夠看以前寫的http://www.cnblogs.com/robsann/p/7521812.html 。關於堆的結構java
堆排序先要使結構堆有序。因此要先使全部的小堆有序,小堆一點一點加入先的元素。最後整個堆有序。解圖。假設你有git
以下數組對象github
[ 2 ][ 4 ] [ 5 ] [ 11 ][ 0 ] [ 7 ] [ 8 ]變成堆的樣子就是 數組
如今這個堆是無序的。首先要讓堆變得有序。性能
咱們先把右邊這個子數變得有序(加深顏色的那個樹)。ui
再把左邊那個子數也變的有序.以下 因此2 11爲root的數 和 8 爲root的數是已經堆有序了。接着咱們再把2爲root的樹變得有序spa
最後變成以下的樣子。htm
如今咱們知道11是最大的,咱們能夠很輕鬆的把11放在數組最末尾的位置表面11是最大的,11 已經排好了位置。對象
接下來咱們就能夠不用管11了。由於11是全部數裏面最大的,並且已經找到了本身的位置。
如今的有序被破壞了。因此咱們必須再次讓堆有序。變成以下
這個時候天然而然就能夠知道8是 除 11外最大的數。 全部把8放到數組末尾第二個位置
一直進行這樣子的操做,就能夠排序數組了。
分析
雖然堆排序的Time proportional to NLg(N) 可是由於堆的比較次數不少,性能不及QuickSort和megeSort
代碼
https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/HeapSort.java