首先我們要了解什麼是堆排序,其排序的時間複雜度為o(nlogn),且不會因為排序的陣列的資料惡化,但需要提供額外的排序記憶體。這裡的堆當中,常用的資料結構就是二叉樹,且是完全二叉樹。根據要排序的方式(公升序,降序)可以將這個二叉樹的特點定義下來,就是根節點都比左右子節點大(大根堆)或者是根節點都比左右子節點小(小根堆)。而整個堆排的過程,包括了乙個建樹,調整樹頂的過程。二話不說,先舉乙個例子來說,假定我們要對序列進行排序,先上我們的流程圖:
這是初步構建出來的樹,之後,我們從葉子節點開始從底向上遍歷,調整樹當中的資料,使其成為大根堆:
通過對圖中畫紅圈的節點進行資料交換,我們可以得到構建出來的大根堆:
之後我們將根節點和最後乙個葉子節點互換,並且將互換後的這個葉子節點固定住(表示這個點已經被排序好)之後調整樹的時候不對該再進行調整。
之後的過程依次類推,最後就可以得到乙個排序好的陣列。
整個流程通過圖可以看的很清晰。那麼接下來我們來看看**實現:
public通過**當中的註解,結合流程圖應該就可以很清晰的理解堆排序的原理和實現過程,這裡就不再進行贅述了。class
testheapsort ;
heapsort(input);
for(int
tmp:input)
system.out.print(tmp+" ");
}//堆排序
public
static
void heapsort(int
array)
}//第一次建樹
public
static
void buildthetree(int
array)
}//調整樹的方法,大頂堆
public
static
void maxify(int array,int size,int
i)
}
資料結構 堆排序(演算法)
基本介紹 基本思想 舉例 示例 public class heapsortdemo 1 將無序陣列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆 int k 1 for int i arr.length 2 1 i 0 i 2 將堆頂元素與末尾元素交換,將最大的元素 沉 到陣列末端 3 重新調整...
資料結構排序演算法之堆排序
關於堆排序的相關知識非常複雜,不懂得可以參考任意一本資料結構教程,本部落格只對堆排序框架及 進行講解。堆排序分三個大的步驟 建初堆,堆調整,堆排序 其中最核心的是堆調整 1建初堆 從陣列中的最後乙個非葉子節點開始,從下而上倒推 重複呼叫堆調整函式 2堆調整 堆調整的前提是已建好了乙個堆,但是因為輸出...
資料結構與演算法 堆排序
1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...