堆技術細節與堆排序 原創

2022-10-11 14:51:11 字數 1664 閱讀 6142

參考:

資料結構:堆)

堆排序)

堆是具有以下性質的完全二叉樹,每個節點的值都大於或等於其左右孩子節點的值稱為最大堆,反之為最小堆。

注意:沒有要求節點的左孩子的值和右孩子的值的大小關係。

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) int

return

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 每個結點的左子樹和右子樹都是乙個二叉堆...