一步一步解析java排序演算法 堆排序(最小堆)

2021-07-16 14:31:33 字數 1695 閱讀 6337

首先明確什麼是堆?

乙個陣列:

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 把陣列的第乙個資料作為比較的原點,比...