一:什麼是堆?
堆可視為 「以陣列方式儲存的一棵完全二叉樹」二:堆排序的思路堆又分為最大堆和最小堆, 最大堆就是對於整個二叉樹中的每乙個節點都滿足:節點的鍵值比其左右子節點的鍵值都要大,對應的最小堆則是:節點的鍵值比其左右子節點的鍵值都要小
對於乙個儲存最大堆的陣列arr(長度為size), 根節點arr[0]是所有節點中鍵值最大,將arr[0]和arr[size-1]的值交換,然後將除去arr[size-1]後的size-1個節點作為乙個獨立的二叉樹,但是此時的這課新的樹由於前面交換arr[0]和arr[size-1]的原因需要重新調整為堆。堆排序就是不斷交換和調整的過程。所以我們先要解決兩個問題
1.如何調整為最大堆(或者最小堆)
2.如何由乙個無序的輸入陣列生成乙個堆
具體**如下:調整:輸入的引數為乙個陣列、堆大小和調整的位置(節點對應的陣列下標,並假設該節點的左右子樹已符合堆性質)
func maxheapify(_ arr : inout [elem], _ size: int, _ pos: int)
let l = 2*pos + 1
let r = 2*pos + 2
var index = pos
if l < size && arr[l] > arr[index]
if r < size && arr[r] > arr[index]
if index != pos
}
如何建立堆:輸入的引數是乙個無序的陣列(乙個從底向上的調整過程)func buildmaxheap(_ arr: inout [elem])
}堆排序:
func heapsort(_ arr: inout [elem])
buildmaxheap(&arr)
var size = arr.count
while size > 1
}測試:
var intarray = [3, 8, 46, 38, 29, 15, 8]
print("before")
for elem in intarray
heapsort(&intarray)
print("after")
for elem in intarray
結果:
測試的環境:
使用 Swift 實現堆排序
排序是計算機的一項主要任務。這並不是因為排序本身非常有趣,而是因為很多其它演算法依賴於排序才能正常執行。本文主要描述如何實現堆排序演算法,該演算法依賴於稱為堆的資料結構。本文的具體實現可以檢視對應的 xcode playground 檔案。堆是乙個完整且部分排序的二叉樹。通俗一點講就是它總是將新資料...
堆排序(java版本)
思路 構造大頂堆,將堆頂元素和最後乙個元素交換,從新調整大頂堆,重複此過程完成排序。節點i的父節點為 i 1 2 節點i的左子樹為 i 2 1 節點i的右子樹為 i 2 2 調整大頂堆時注意要從最後一課子樹從下向上調整 public static void heapsort int a for i ...
排序演算法 堆排序(遞迴版本)
堆積排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法。堆積樹是乙個近似完整二叉樹的結構,並同時滿足堆積屬性 即子結點的鍵值或索引總是小於 或者大於 它的父結點。在堆積樹的資料結構中,堆積樹中的最大值總是位於根節點。堆積樹中定義以下幾種操作 1.最大堆積調整 max he...