選擇排序(三) 堆排序

2021-08-25 12:45:04 字數 866 閱讀 1329

這樣,還剩下兩個問題:1.如何將乙個交換後的無序區調整為大根堆; 2.如何在排序之前建立那個初始的大根堆。而第二個問題是可以通過第乙個問題的解決而解決的。

1.如何將乙個交換後的無序區調整為大根堆?

由於進行元素交換前,無序區是乙個大根堆,即左子樹和右子樹都是大根堆,所以根節點變化後左右子樹仍然都是大根堆,無序區里的最大元素一定在新根節點、左右子樹的根節點這三個結點裡。先儲存新的根節點的值以待後用。如果新的根結點最大,說明已經是大根堆,調整完畢;

否則比較左右子樹根節點,找出較大的,它是無序區現存的最大元素,應該作為新的大根堆中的根,所以將此節點上調至根節點位置,接下來就只需要調整此結點原來所在的子樹為大根堆即可(因為大根堆對左右子樹之間元素的大小關係沒有要求!)。

2..那麼如何利用此過程建立初始大根堆呢?

若陣列下標範圍為0~n,考慮到單獨乙個元素是大根堆,則從下標[n/2]開始的元素均為大根堆(葉節點)。於是只要從[n/2]-1開始,向前依次構造大根堆,這樣就能保證,構造到某個節點時,它的左右子樹都已經是大根堆(這就可以呼叫我們上面討論的調整為大根堆的方法了)。一直到下標為0的結點,就完成了初始大根堆的建立。 堆排序用到的函式有兩個:1個將左右子樹都為大根堆的完全二叉樹調整為大根堆的調整函式;1個反覆呼叫此調整函式來進行排序的排序函式。

/*選擇排序 3) 堆排序*/ templatevoid heapadjust(sqlist&l,int s, int m) l.key[s]=rc; } templatevoid heapsort(sqlist&l) cout<1;i--) }

輸入:50,435,6437,768,8,45,567,1435;

從第length/2開始構造,即第4個768開始構造大根堆

選擇排序(三) 堆排序

這樣,還剩下兩個問題 1.如何將乙個交換後的無序區調整為大根堆 2.如何在排序之前建立那個初始的大根堆。而第二個問題是可以通過第乙個問題的解決而解決的。1.如何將乙個交換後的無序區調整為大根堆?由於進行元素交換前,無序區是乙個大根堆,即左子樹和右子樹都是大根堆,所以根節點變化後左右子樹仍然都是大根堆...

排序演算法 三 堆排序

1.heap.class package cn.sort.heap 堆排序實現 公升序排序 author ly public class heap system.out.println 向下調整 先拿左右子樹進行比較,看誰比較大,然後再拿大的與父結點進行比較,若孩子結點比較大,則大孩子與父結點交換,...

排序(三)堆排序 歸併排序 快速排序

7 堆排序 堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構 通常堆是通過一維陣列來實現的 並同時滿足堆的性質 即子結點的鍵值總是小於 或者大於 它的父節點。我們可以很容易的定義堆排序的過程 1 建立乙個堆 2 把堆頂元素 最大值 和堆尾元素互換 3 把堆的尺寸縮小1...