排序演算法(二) 堆排序

2021-08-19 18:14:56 字數 1559 閱讀 4563

堆排序:堆是指每個節點值大於/小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大/小節點所在處

。節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆

叫小頂堆。

堆排序過程:

1、將無序陣列構建成堆結構。

2、將根節點值與最後乙個節點值互換,此時最後乙個節點值最大

3、將剩下的n-1個節點重新構造為堆結構,繼續步驟2,3,直至陣列有序

堆排序是基於完全二叉樹的資料結構,在堆排序的過程中會用到一些完全二叉樹的性質,如下:(以下n均為節點個數)。

2i > n,則i節點沒有左子樹,2i + 1 > n,則i節點沒有有子樹。i從1開始算。

在完全二叉樹中,最後

乙個非葉子節點的是

第(n-1)/2個節點,此為完全二叉樹的性質,自己尚未驗證。但是陣列的下標是從0開始的,所以最後乙個非葉子節點的

下標為(n-1-1)/2 = n/2 -1,n為陣列長度。

此**建立的是大堆,得到公升序結果,從

最後乙個非葉子節點開始調整。

public class heapsort 

return arr;

}/**

* @desc 構建初始堆

* @param arr

* @return

*/public static int init(int arr)

return arr;

}/**

* @desc 將當前節點i與其所有子樹調整為堆結構

* @param arr 待調整陣列

* @param i 當前節點

* @param length 陣列長度

* @return

*/public static int adjustheap(int arr,int i,int length)

//將左右節點的較大者與父節點比較,若arr[larger]更大,將arr[larger]上移到i位置,也就是當前的父節點位置

//將父節點位置指向larger,注意此時並沒有將父節點的值放到larger,因為經過調整後,larger之後的元素可能不滿足堆結構

//所以還要進一步判斷找到父節點的最終位置,只是將父節點的位置暫時指向了larger

if (arr[larger] > temp)else

}arr[i] = temp;

return arr;

}}

堆排序是一種選擇排序,整體主要由構建初始堆+交換堆頂元素和末尾元素並重建堆兩部分組成。其中構建初始堆經推導複雜度為o(n),在交換並重建堆的過程中,需交換n-1次,而重建堆的過程中,根據完全二叉樹的性質,[log2(n-1),log2(n-2)...1]逐步遞減,近似為nlogn。所以堆排序時間複雜度一般認為就是o(nlogn)級。

參考:

排序演算法二 堆排序

堆排序的時間複雜度為 o nlgn def max heapify lst,start,end 建立最大堆 root start while true child 2 root 1 左孩子 if child end break if child 1 end and lst child child 1...

演算法二 堆排序

堆排序,其複雜的為nlog n include using namespace std 交換陣列下標為i,j的元素 void swap int tree,int i,int j 堆化,將陣列轉化為大頂堆 如 4,10,3 10,4,3 如果i節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼...

排序二 堆排序

子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...