首先明確什麼是堆?
乙個陣列:
int unsort=;堆的表現形式(這是乙個最小堆,根節點是最小的):
用陣列來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。(這樣就是給數組建好堆了)
下面進入堆排序的核心步驟:堆節點的移動
這裡需要對unsort[3]=12進行調整
對unsort[3]的子節點unsort[7],unsort[8]進行比較,符合最小堆!
對unsort[1]=24進行調整
跟左子節點進行調整
對unsort[0]=40進行調整
比較左右子節點,12<35;下面看**:12<40進行調整,上移;
比較左右子節點,24<50;
24<40,上移;
55<56;55>40;至此調整結束,24所在索引位置替換成40;
最小堆的根節點值最小。
//從i節點開始調整, i節點的子節點為 2*i+1, 2*i+2
public
static
void
minheapfixdown(int a, int i, int n)
a[i] = temp; //調整結束
}
有了堆的調整操作,建立堆,進行堆排序:
/**
* 建立最小堆
* 對陣列中的每個元素進行子節點調整,最小的向上移動
*@param a 陣列
*@param n 陣列長度
*/static
void makeminheap(int a, int n)
public
static
void
minheapsorttodescendarray(int a, int n)
}
此時得到的陣列是遞減的:
public
static
void
main(string args) ;
minheapsorttodescendarray(unsort, unsort.length);
for (int i = 0; i < unsort.length; i++)
}
執行結果:
101 100 80 56 55 40 24 12 8
一步一步解析java排序演算法 堆排序(最大堆)
與最小堆 遞減 類似 最大堆 遞增 的調整操作 從i節點開始調整,i節點的子節點為 2 i 1,2 i 2 public static void maxheapfixdown int a,int i,int n a i temp 調整結束 建立最大堆 建立最大堆 對陣列中的每個元素進行子節點調整,最...
一步一步寫演算法(之堆排序)
堆排序是另外一種常用的遞迴排序。因為堆排序有著優秀的排序效能,所以在軟體設計中也經常使用。堆排序有著屬於自己的特殊性質,和二叉平衡樹基本是一致的。打乙個比方說,處於大堆中的每乙個資料都必須滿足這樣乙個特性 1 每乙個array n 不小於array 2 n 2 每乙個array n 不小於array...
一步一步寫演算法(之快速排序)
快速排序是程式設計中經常使用到的一種排序方法。可是很多朋友對快速排序有畏難情緒,認為快速排序使用到了遞迴,是一種非常複雜的程式,其實未必如此。只要我們使用好了方法,就可以自己實現快速排序。首先,我們複習一下,快速排序的基本步驟是什麼 1 判斷輸入引數的合法性 2 把陣列的第乙個資料作為比較的原點,比...