堆的定義:
n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。
大頂堆:k
i >= k
2i 且k
i >= k
2i+1。
小頂堆:k
i <= k
2i 且k
i <= k
2i+1。
堆序列可以理解成乙個完全二叉樹,該樹任意乙個結點的關鍵字的值都小於或等於它的孩子結點的關鍵字。例如:
堆排序:
若在輸出堆頂的最小值之後,使得剩餘n-1個元素的序列重又建成乙個堆,則得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列,這個過程稱之為堆排序。
實現堆排序需要解決兩個問題:
1.如何由乙個無序序列建成乙個堆?
n個元素的序列,從最後乙個節點的父節點開始建堆,這個父節點為第n/2個元素。然後依次往上遞減(n/2--)篩選出最大值或最小值,將樹頂端的最大值或是最小值與最後乙個元素交換。方法buildmaxheap()的功能。
2.如何在輸出堆頂元素之後,調整剩餘元素成為乙個新的堆?
對剩下的n-1個元素重新建堆,重複1中方法。
package sort;
public class headsort
}//將左右結點父結點中的最大值放到父節點中
if(data[i] <=data[biggerindex])
} }
public static void main(string args)
; headsort as = new headsort();
as.headsort(a);
// int result = new headsort().headsort(a);
for(int i=0;i
用於從多個數中找出最大(小)的n個
資料結構 堆,小頂堆,大頂堆,堆排序
堆是什麼?堆是一種特殊的完全二叉樹,就像下面這棵樹一樣 這棵樹有乙個很顯著的特點,那就是所有父結點都要比子結點要小。符合這樣要求的完全二叉樹我們成為 最小堆 反之,如果所有父結點都要比子結點大,這樣的完全二叉樹被稱為 最大堆 如果我們現在要刪除掉最小的數字,並重新插入乙個數字,再從中找出最小的數字。...
Java 堆排序 大頂堆 小頂堆
引用 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序的平均時間複雜度為 nlogn 演算法步驟 1.建立乙個堆h 0.n 1 2.把堆首 最大值 和堆尾互換 3....
排序演算法 堆排序(大頂堆 小頂堆)
堆排序的思想這裡就先不講了,以後有時間再補上,下面是分別採用大頂堆和小頂堆實現的堆排序。注意 下面例子中排序的數字是。大頂堆方式 include include using namespace std 堆調整 將nums s.m 調整為大頂堆,其中除了nums s 之外均滿足大頂堆的定義 void ...