排序演算法 堆排序

2021-06-14 23:26:43 字數 970 閱讀 4508

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。

一、堆的定義

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...

排序演算法 堆排序

都說堆排序是時間複雜度最小的排序演算法,講了各種堆排序的好,我這裡就不贅述了,今天花了乙個下午和半個晚上的時間算是差不多研究明白了堆排序。其實堆排序的邏輯並不是特別複雜,如果理解了就會覺得沒有那麼難,但是寫 的實現的時候,還是需要考慮很多事情的。反正我是被繞暈過的 首先,寫一下我對堆排序思想的認識。...