JS資料結構 二叉堆 堆排序

2021-10-24 11:10:03 字數 1504 閱讀 7079

結構特性:這是一種特殊的二叉樹,他是乙個完全的二叉樹,樹的每一層都有左右子樹,並且最後一層的葉節點盡可能都是左子樹

堆特性:二叉堆不是最小堆就是最大堆。最小堆允許快速找到樹的最小值,最大堆允許找到樹的最大值。所有節點都大於等於(最大堆)或者小於等於(最小堆)每個他的子樹

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