(1)小頂堆
假設有n
個元素的序列,
k0-kn,
如果將這組資料排成一棵完全二叉樹,則此樹的特點是:樹中所有節點的值都小於其左右節點的值,此樹的根必然是最小的;
(2)大頂堆
假設有n
個元素的序列,
k0-kn,
如果將這組資料排成一棵完全二叉樹,則此樹的特點是:樹中所有節點的值都大於其左右節點的值,此樹的根必然是最大的;
堆排序演算法思想:
大頂堆的根節點一定是這組資料中最大的數,如果需要對一組數進行排序,則需要先將這組資料建成大(小)頂堆,然後接可以選擇出這組資料中最大(小)的數。
第一趟先將0
—n-1
處的所有資料建成大頂堆,就可以選擇出這組資料中最大的數;
第二趟將0-n-2
處的所有資料建成大頂堆,就可以選擇出這組資料中最大的數;
第k趟將
0-n-k
處的所有資料建成大頂堆,就可以選擇出這組資料中最大的數;
堆排序的步驟分為兩步:
(1)建堆;
從最後乙個非葉子節點開始,比較該節點和其孩子節點中加大的那個節點的值,
如果較大的那個子節點的值大於父節點,則交換父節點和該子節點的值;
向前逐步調整直到根節點,保證每個節點的值都大於等於其左右子節點的值,一次建 堆完成
(2)把堆的根節點和當前陣列的最後乙個節點交換;
對於包含n
個元素的陣列而言,需要
n-1次建堆,每次建堆的作用就是選出該堆的最大(小)值;
public class heapsort
}private void bulidmaxheap(intarray,int lastindex)
}if(array[current] < array[biggerindex])//如果當前節點小於它的子節點中較大的那個元素,將當前節點和簡答的子節點交換
else}}
}private void swap(intarray,int i,int j)
java實現堆排序
許多應用要用堆,比如,優先佇列,即佇列的擴充,佇列的每個元素增加乙個稱為優先順序的字段,優先佇列可以是線性結構的,但要有較高的效率,應把它組織成堆結構。元素入隊是,相當於執行堆的插入演算法 但在隊頭每次刪除的總是隊頂具有最大優先順序的元素,因此可以把它稱為最大優先順序佇列。再比如,堆排序是選擇排序中...
堆排序java實現
公升序用大根堆,降序用小根堆 調整堆 從根節點開始向下調整堆 先建立初始堆,從n 2 1 第乙個非葉子節點 節點開始,將之看做根節點,向下調整堆,到根節點結束 迴圈i from n 1 to 0,每次取出堆的最頂層根節點,即陣列下標為0,然後與節點i交換,這樣對於大根堆而言,最大值總是在後面,再從根...
Java 實現堆排序
堆排序主要是利用堆在根節點上的特性,既在大頂堆的情況下,堆的第乙個元素是堆當中最大的元素,而在小頂堆的情況下,堆的第乙個元素是最小的節點。所以在堆排序的過程,主要的操作就是對每次取出堆頂的元素之後 在這裡使用大頂堆 我們就選出了堆中的最大元素,然後對堆剩下的元素進行再次進行大頂堆的調正,得到乙個新的...