要想用堆來實現排序,首先得構建乙個堆。
將字串"sortexample"放入起始下標為1的陣列中,構成一顆二叉樹:
構造堆時,從最後乙個非葉子節點出發。如上圖所示,最後乙個非葉子節點下標為n/2=5,可以觀察出任意乙個大小為n的二叉堆的最後乙個非葉子節點的標號都是n/2。從5開始一直到根節點1,一直進行sink操作,整個過程可以保證較大元素一直處於堆的上方,而較小元素則沉在堆的下方。如下圖:
此時,最大的元素x已在根節點,第二第三大的元素在堆的第二層……元素的大小按層次相對有序。此時,正式進入排序階段:
將根節點與最後乙個葉子節點交換(將堆中的最大元素拿出,並使堆的大小減一),然後將根節點sink到大小減一後的堆的合適位置,以此類推,直到堆的大小為1,排序便結束。為了形象地說明這一過程,請看下圖:
給出**:
public class heapsort
/* 排序 */
while (n > 1) }
public static void sink(comparable a, int k, int h) }
public static void exch(comparable a, int p, int q)
public static boolean less(comparable v, comparable w)
public static void showheap(comparable a)
system.out.println("\n");
}}
測試結果:
public static void main(string args) ;
sort(a);
showheap(a);
}-59 -34 1 2 3 4 5 41 95
對於大小為n的堆,構造堆時的比較次數不大於2n,每次sink時最多可能需要2lgn次比較。 堆排序的實現
堆排序是利用了一種資料結構叫做二叉堆,二叉堆是這樣定義的 二叉堆是一種特殊的堆,二叉堆是完全二元樹或者是近似完全二元樹,有最小堆和最大堆 特點 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 利用堆排序資料的儲存方式如...
堆排序的實現
file binaryheap.hpp brief 二叉堆 author xiao2 joyjj0218 qq.com version 1.0 date 2015.11.17 ifndef binaryheap hpp define binaryheap hpp include include us...
堆排序的實現
前面在執行希爾排序,插入排序的時候,我是以下標為0開始儲存順序表結點,但是在堆排序的時候發現這樣的結構對於堆排序這樣頻繁使用下標的演算法來說比較麻煩,於是我將原來的 修改了一下,使其下標從1開始 下面是具體函式實現 include include include includeusing names...