花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。
一、堆的定義
1. 父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值;
2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
二、已知結點 i ,則它的子結點 為2*i+1 與 2*i+2 ;父節點為(i-1)/2 ;
三、堆排序
堆排序分為幾個部分;
1.初始化堆; 2.輸出堆頂元素 ; 3.使用最後乙個元素替代堆頂元素,調整堆,迴圈輸出;
調整結點i ,使之成為大根堆或者小根堆,演算法如下:
// 從i節點開始調整,n為節點總數 從0開始計算 i節點的子節點為 2*i+1, 2*i+2
void adjustheap (int a[ ], int i, int n)
a[i] = temp;
}
堆的儲存一般是線性陣列;調整堆時從第乙個不是葉子節點的非終端結點,即(n-1)/2開始,開始向下調整;
初始化堆的演算法:
/*
輸入:陣列a,堆的大小n
功能:建堆
*/void buildheap(int a[ ], int n)
}
堆排序 就是將堆頂元素輸出(分大根堆或者小根堆),然後堆進行調整,迴圈輸出;演算法如下:
void
heapsort
(int a[ ], int n)
}
接下來分析下演算法時間的複雜度:
初始化堆的時候:o(n) 是個複雜的公式推導,有興趣可以自行推導
調整堆的時候:o(logn),迴圈調堆 複雜度:o(nlogn)
因此最好或者最壞情況下,堆排序的執行時間都是o(nlogn)
排序演算法 堆排序
1 什麼是堆 首先它是一顆完全二叉樹,並且父結點的值大於子節點的值 最大堆 或父結點的值小於子結點的值 最小堆 小根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。大根堆 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。2 堆...
排序演算法 堆排序
由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...
排序演算法 堆排序
都說堆排序是時間複雜度最小的排序演算法,講了各種堆排序的好,我這裡就不贅述了,今天花了乙個下午和半個晚上的時間算是差不多研究明白了堆排序。其實堆排序的邏輯並不是特別複雜,如果理解了就會覺得沒有那麼難,但是寫 的實現的時候,還是需要考慮很多事情的。反正我是被繞暈過的 首先,寫一下我對堆排序思想的認識。...