結構特性:這是一種特殊的二叉樹,他是乙個完全的二叉樹,樹的每一層都有左右子樹,並且最後一層的葉節點盡可能都是左子樹
堆特性:二叉堆不是最小堆就是最大堆。最小堆允許快速找到樹的最小值,最大堆允許找到樹的最大值。所有節點都大於等於(最大堆)或者小於等於(最小堆)每個他的子樹
1.正常的情況下,陣列可以通過節點指標的方式表示
2.也可以通過陣列的方式表示節點,一般情況下:
getleftindex(index)
getrightindex(index)
getparentindex(index)
return math.floor((inedx-1)/2)
}
建立最小堆
整個過程為:將值插入堆的底部葉節點,然後再執行上移shifup
操作,將值和他的父節點進行交換,直到父節點小於這個插入的值
class minheap
//新增並上移的操作
insert(index)
return false
}//上移具體過程
如果插入的值比父元素大,就交換位置
shifup(index)
}function swap(array,a,b)
在堆中找到最小值或者最大值
在堆中,最小的值總是位於陣列的第乙個位置(堆的根節點
size()
isempty()
findmin()
匯出堆中的最小值或最大值
移除最大值或最小值表示的是要移除堆陣列中的第乙個元素,在移除了之後將堆的最後乙個元素移動到根部並執行下移siftdown操作
開始交換元素一直到堆正常
extract()
if(this.size()===1)
const removedvalue = this.heap.shift()
this.siftdown(0)
return reovedvalue
}//具體的下移操作
siftdown(index)
if(rightthis.heap[right])
if(index !== element)
}
最大堆演算法跟最小堆類似,只不過把所有大於換成小於即可
用陣列建立乙個最大堆用於源資料
在建立最大堆之後,最大的值會被儲存在堆的第乙個位置,然後把這個值替換成堆的最後乙個值,並將堆的大小-1
將堆的根節點下移並重複步驟2直到堆的大小為1
如果想要公升序的話 就是最大堆,想要降序就是最小堆
function heapsort(array,comparefn)
return array
}function buildmaxheap(array,comparefn)
return array
}
資料結構之二叉堆 堆排序
很久以前排序演算法的時間複雜度一直是o n 2 當時學術界充斥著 排序演算法不可能突破o n 2 的聲音,直到1959年,由d.l.shell提出了一種排序演算法,希爾排序 shell sort 才打破了這種不可能的聲音,把排序演算法的時間複雜度提公升到了o n 3 2 當科學家們知道這種 不可能 ...
資料結構之二叉堆 堆排序
很久以前排序演算法的時間複雜度一直是o n 2 當時學術界充斥著 排序演算法不可能突破o n 2 的聲音,直到1959年,由d.l.shell提出了一種排序演算法,希爾排序 shell sort 才打破了這種不可能的聲音,把排序演算法的時間複雜度提公升到了o n 3 2 當科學家們知道這種 不可能 ...
二叉堆 堆排序
堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...