堆排序(Swift版本)

2022-08-27 21:51:20 字數 1468 閱讀 1889

一:什麼是堆?

堆可視為  「以陣列方式儲存的一棵完全二叉樹」

堆又分為最大堆和最小堆, 最大堆就是對於整個二叉樹中的每乙個節點都滿足:節點的鍵值比其左右子節點的鍵值都要大,對應的最小堆則是:節點的鍵值比其左右子節點的鍵值都要小

二:堆排序的思路

對於乙個儲存最大堆的陣列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...