參考:
資料結構:堆)
堆排序)
堆是具有以下性質的完全二叉樹,每個節點的值都大於或等於其左右孩子節點的值稱為最大堆,反之為最小堆。
注意:沒有要求節點的左孩子的值和右孩子的值的大小關係。
1,堆使用陣列實現,不是結點和指標。
2,堆的屬性可以讓堆和陣列元素直接對應起來
這個陣列arr邏輯上就是乙個堆。
從這裡我們可以得出以下性質(重點)
對於大頂堆:arr[i] >= arr[2i + 1] && arr[i] >= arr[2i + 2]
對於小頂堆:arr[i] <= arr[2i + 1] && arr[i] <= arr[2i + 2]
1,index從0開始
2,父節點為 i,左節點:2i+1;右結點:2i+2
3,子節點為 i,floor( (i-1)/2) 等價於 (i-1)>>1
上浮操作
當前結點與父節點比較,小於父節點則交換(最小堆情況下,最大堆相反),遞迴向上
func heapup(arr int,index int) else
index=pi
}//return arr}//
test
arr:=int
heapup(arr,len(arr)-1
)fmt.println(arr)
下沉操作
當前結點與左右子節點比較,大於較小的節點則交換(最小堆的情況下,最大堆是小於較大的節點),遞迴向下
func heapdown(arr int,index int)
if iv>small
else
index=si
}}//測試
arr:=int
heapdown(arr,0)
fmt.println(arr)
1,先把元素插入到末尾
2,使用上浮操作,對插入的尾部元素
1,將頭尾元素交換
2,刪除交換後的尾部元素
3,使用下層操作,對交換後的嘔吐不元素
直接獲取小標為0的元素
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),是不穩定排序
演算法步驟
建立乙個堆 h[0……n-1];
把堆首(最大值)和堆尾互換;
把堆的尺寸縮小 1,並呼叫 shift_down(0),目的是把新的陣列頂端資料調整到相應位置;
重複步驟 2,直到堆的尺寸為 1。
show me the code
func heapsort(arr int) intreturn
arr}
func buildmaxheap(arr
int, arrlen int) }
func heapify(arr
int, i, arrlen int
)
if right < arrlen && arr[right] >arr[largest]
if largest !=i
}func swap(arr
int, i, j int
)
堆與堆排序
二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時...
堆與堆排序
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。堆排序是就地排序,輔助空間為o 1 它是不穩定的排序方法。排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前 和排序後他們的相對位置不發生變化 先說說什麼是堆,堆通常是乙個可以被看做一棵樹的陣列物...
堆與堆排序
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...