堆排序演算法主要分為初始化堆和交換最大值重建堆的過程,下面記錄下它的**實現:
public class heap
public static void sort(double pq) }
private static void sink(double pq,int k,int n)
} private static void exch(double a,int b,int c)
}
堆排序演算法包括構建堆的過程和交換最大值重建堆的過程。
構建堆的過程:令k為堆的高度,i表示第幾層,構建堆進行的是下沉操作,比較和交換是從倒數第二層開始的,一直往上到第一層,每次交換會比較第n、2n、2n+1位置的元素。因此可得每層所需時間為:
s=[2^(i-1)]*(k-i)。
其中2^(i-1)表示該層有多少個元素,k-i表示該層上所需的比較次數。
總的時間即s=[2(k-2)]*1+[2(k-3)]*2+[2(k-4)]*3+…[2(0)]*k-1。
由2s-s=2k-1+2k-2+2k-3…+2-k+1,等比求和即s=2k-k+1,因為k為堆高度等於logn,所以s=n-logn+1因為堆排序是就地排序,空間複雜度為常數:o(1)。
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...
排序演算法 堆排序
由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...