參考:
堆是一顆完全二叉樹:葉節點只能出現在最下層和次下層,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。而且堆還必須滿足以下性質:父節點大於等於左右子節點(大堆),或者父節點小於等於左右子節點(小堆),後面為了表述方便,在文章中只討論大堆。
由此可以看出大堆有二個重要的性質:
1.在堆頂的一定是值最大的元素。
2.堆的左右子樹還是乙個堆。
表示方式出乎想象的簡單。由此圖:
觀察可以發現:i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。
所以說,只需要將堆按從上到下,從左到右的順序儲存在陣列中即可。用上面總結出的公式尋找某個節點的父節點或者子節點。
按從右到左,從下到上的順序對每個節點進行判斷。確保此節點大於其左右子節點。如果不滿足,就找出左右子節點中最大的,進行交換。當然,交換完成後,子節點可能不再滿足堆的性質,所以需要進行遞迴,直到到達葉子結點。由於最後乙個元素的父節點座標是(n – 1) / 2,大於這個節點的都是葉子節點。所以只需要從(n – 1) / 2開始判斷即可。
時間複雜度:n*lgn。(用極限貌似可以算出來是n,nlgn可以認為是乙個粗略但是正確的結果)
構造出堆之後,將第乙個元素(最大的元素)和陣列最後乙個元素進行交換,同時將堆的規模減小1。
對第乙個元素進行一次維護,時間複雜度為lgn。
重複此步驟,直到每個元素都完成排序。
總時間複雜度為nlgn。
package datastructureandalgorithms;
public
class
selectsort_heapsort
; system.out.
println
("未排序陣列順序為:");
display
(array)
; system.out.
println
("-----------------------");
sort
(array)
; system.out.
println
("-----------------------");
system.out.
println
("經過堆排序後的陣列順序為:");
display
(array);}
// 堆排序
public
static
void
sort
(int
array)
system.out.
println
("構造完成的堆:");
display
(array)
;int count =0;
// 確定位置i上的元素
for(
int i = maxindex; i >=
1; i--)}
public
static
void
buildmaxheap
(int
array,
int index,
int maxindex)
if(right <= maxindex && array[largest]
< array[right])if
(largest != index)
}public
static
void
display
(int
array)
system.out.
println();}}
未排序陣列順序為:
4 2 8 9 5 7 6 1 3
-----------------------
構造完成的堆:
9 5 8 3 4 7 6 1 2
經過第0輪排序後:
8 5 7 3 4 2 6 1 9
經過第1輪排序後:
7 5 6 3 4 2 1 8 9
經過第2輪排序後:
6 5 2 3 4 1 7 8 9
經過第3輪排序後:
5 4 2 3 1 6 7 8 9
經過第4輪排序後:
4 3 2 1 5 6 7 8 9
經過第5輪排序後:
3 1 2 4 5 6 7 8 9
經過第6輪排序後:
2 1 3 4 5 6 7 8 9
經過第7輪排序後:
1 2 3 4 5 6 7 8 9
-----------------------
經過堆排序後的陣列順序為:
1 2 3 4 5 6 7 8 9
排序 選擇排序 選擇排序 堆排序
寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...
選擇排序 堆排序
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...
選擇排序 堆排序
堆排序 堆排序分為兩個過程 1 將原來無序的數列,轉化成堆序列 建初識堆的過程 2 輸出堆頂元素並調整建新堆的過程 資料結構偽 typeof sqlist heaptype void heapadjuisti heaptype h,int s int m for i h.length i 1 i c...