堆排序演算法(java實現)

2021-06-05 11:49:08 字數 994 閱讀 1160

public class heapsort 

//左孩子編號

public static int leftchild(int i)

//右孩子編號

public static int rightchild(int i)

/*** 保持最大堆的性質

* @param a,堆中的陣列元素

* @param i,對以該元素為根元素的堆進行調整,假設前提:左右子樹都是最大堆

* * 由於左右孩子都是最大堆,首先比較根元素與左右孩子,找出最大值,假如不是根元素,則調整兩個元素的值;

* 由於左孩子(右孩子)的值與根元素交換,有可能打破左子樹(右子樹)的最大堆性質,因此繼續呼叫,直至葉子元素。

*/public static void max_heapify(int a, int i)

if(largest == i)else

} /**

* 建立最大堆。在資料中,a.length/2+1一直到最後的元素都是葉子元素,也就是平凡最大堆,因此從其前乙個元素開始,一直到

* 第乙個元素,重複呼叫max_heapify函式,使其保持最大堆的性質

* @param a

*/public static void build_max_heap(int a)

} /**

* 堆排序:首先使用建立最大堆的演算法建立好最大堆,然後將堆頂元素(最大值)與最後乙個值交換,同時使得

* 堆的長度減小1 ,呼叫保持最大堆性質的演算法調整,使得堆頂元素成為最大值,此時最後乙個元素已被排除在外、

*/public static void heapsort(int a)

} public static void main(string args) ;

heap_size = a.length;

heapsort(a);

for(int i = 0; i< a.length; i++)

}}

Java實現堆排序演算法

這是第乙個 之前只知道如何建堆,不知道演算法導論上還有如此巧妙的堆調整演算法。所以一開始自己寫的堆排序演算法非常低效,事件複雜度為o n 2 因為每次排序都是重建堆。但是,自己寫的程式還是有自己獨特的思想的,依然要分享出來給大家看看,尤其是確定陣列表示的樹的首個葉子節點的位置的方法。以下為 pack...

java實現堆排序演算法

堆排序相對簡單的冒泡演算法快就快在它利用了每一次排序,將結果儲存下來。堆結構是一顆完全二叉樹,即除了最後一層其他層的每個結點都包含兩個子結點,我們知道擁有子節點的元素腳標是0至n 2 1,我們從n 2 1開始向上構建大頂堆結構,每乙個父親結點的值都大於孩子結點,先取得左結點l和右結點r,比較結點大小...

排序演算法之堆排序java實現

堆排序 heap sort 的基本思想是迴圈執行如下過程直到陣列為 空 什麼是最大堆?堆是乙個具有這樣性質的順序二叉樹,每個非葉子節點的關鍵字大於等於它的孩子結點的關鍵字。顯然在乙個堆中,根節點具有最大值,而且堆中任何乙個結點的非空左 右子樹都是乙個堆,它的根節點到任一葉子的每條路徑上的節點都是遞減...