排序演算法 堆排序

2021-06-09 22:37:21 字數 1362 閱讀 2065

1、什麼是堆

首先它是一顆完全二叉樹,並且父結點的值大於子節點的值(最大堆)或父結點的值小於子結點的值(最小堆)。

小根堆:根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆,又稱最小堆。

大根堆:根結點(亦稱為堆頂)的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆,又稱最大堆。

2、堆排序

利用了大根堆或最小堆堆頂記錄的關鍵字最大或最小這一特徵,使得在當前無序區中選取最大或最小的關鍵字變得簡單。

用大根堆排序的基本思想

① 先將初始檔案r[0..n-1]建成乙個大根堆,此堆為初始的無序區。(max_heapify()函式完成建立最大堆的功能)

② 再將關鍵字最大的記錄r[0](即堆頂)和無序區的最後乙個記錄r[n-1]交換,由此得到新的無序區r[0..n-2]和有序區r[n-1],且滿足r[0..n-2].keys≤r[n-1].key

③由於交換後新的根r[0]可能違反堆性質,故應將當前無序區r[0..n-2]調整為堆。然後再次將r[0..n-2]中關鍵字最大的記錄r[0]和該區間的最後乙個記錄r[n-2]交換,由此得到新的無序區r[0..n-3]和有序區r[n-2..n-1],且仍滿足關係r[0..n-3].keys≤r[n-2..n-1].keys,同樣要將r[0..n-3]調整為堆。

……

直到無序區只有乙個元素為止。(heapsort()對最大根堆進行排序)

可得:若公升序排列,應該建立最大堆,若降序排列,建立最小堆。

**如下:

// array是待調整的堆陣列,i是待調整的陣列元素的位置,即待調整的父結點,size是陣列的長度,即結點總數 

void heapify(int array,int i,int size)

// 堆排序演算法,排序過程

void heapsort(int array,int size) }

int main()

; int length=sizeof(a)/sizeof(int);

printf("陣列元素如下所示: \n");

for(int i=0;i注:堆排序的最壞

時間複雜度

o(nlogn)。堆排序的平均效能較接近於最壞效能。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

堆排序是就地排序,輔助空間為o(1),

它是不穩定的排序方法。

排序演算法 堆排序

花了一晚上時間研究堆排序,這個排序困擾了哥很久,終於搞清楚了。一 堆的定義 1.父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 二 已知結點 i 則它的子結點 為2 i 1 與 2 i 2 父節點為 i 1 2 三 堆排序...

排序演算法 堆排序

由於不經常使用,之前學習看過的演算法都給忘了。現在把他們寫下來,記錄下來,以方便以後查閱。本篇文章的 即為堆排序的 主函式中是對輸入檔案中的序列進行排序,並將結果輸出到乙個檔案中。這是一種形式類似於google codejam的測試方法。include include using namespace...

排序演算法 堆排序

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