堆排序演算法的時間複雜度為o(nlogn),一般採用上濾建堆,如果考慮用下濾建堆,不僅可以精簡**,而且時間也會更快。
//堆排序演算法的改進
void siftdown(int *v, int l, int u)
}frank-liu)
我們可以發現乙個n個元素的樹,它的高度相當於logn(向下取整)。
我們再來看我們分析的第二個結論。對應樹每乙個高度的一層,該有多少個元素呢?假設高度為1的那一層他們的元素個數為k,那麼他們的訪問時間複雜度為o(k)。根據前面的分析,我們還發現乙個情況,就是如果從根結點開始計數,往下第i層的元素如果不是最後一層的話,這一層的元素數量為2**i(2的i次方)。正好這個第i層就相當於樹的總高度減去當前層的結點的高度。假設第i層的高度為h,那麼也就是i = lgn - h。
這一層的元素數量為:
那麼他們所有元素的運算時間總和為如下:
根據如下公式:
則有:
選擇排序及其改進 堆排序
include include iomanip using namespace std 選擇排序思想 每一趟 如第i趟 從後面n i 1個待排序的元素中選出關鍵字最小的元素,作為有序子串行 前i 1個有序 的第i個元素,直至n 1趟結束。因為最後乙個元素是不用再排序的 沒有比它再小的元素了,他是最後...
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...