JS實現堆排序

2021-08-03 10:24:50 字數 1159 閱讀 1001

【概念】

堆是一棵順序儲存完全二叉樹

堆排序分為兩種:

1)大根堆:所有的葉子不大於根。ri >= r2i+1ri >= r2i+2 (

大根堆)

2)小根堆:所有的葉子不小於根。ri <= r2i+1ri <= r2i+2 (

小根堆)

其中i=1,2,

…,n/2

向下取整

; 當前節點為r[i],左孩子是r[2*i+1],右孩子是r[2*i+2]。父結點是r[(i-1)/2]。

【思想】

(1)根據初始陣列去構造初始堆(構建乙個完全二叉樹,保證所有的父結點都比它的孩子結點數值大)。

(2)每次交換第乙個和最後乙個元素,輸出最後乙個元素(最大值),然後把剩下元素重新調整為大根堆。 

【例子】以建立大根堆為例

建立了堆之後,每次都是從陣列的len/2的位置開始,比較下標為[len/2-1]的結點和他的孩子之間的關係,找到最大的,交換到根結點的位置,然後依次向前推乙個。

1,3,4,5,2,6,9,7,8,0有10個數,10/2=5,那麼從下標為[4]的結點開始比較,r[2]=2,比較2和和她的孩子0,根結點已經是最大了,不操作。

比較r[3]=5和她的孩子7、8,發現5比8小,互換。

比較r[2]=4和她的孩子6、9,發現9比4大,互換。再向前推乙個。

比較r[1]=3和她的孩子8、2,發現8比3大,互換。3和下面的孩子7、5比較,交換7和3,此時得到大根堆。

比較r[0]=1和她的孩子8、9,發現9比1大,互換。

此時二叉樹中根=9是根堆。

堆排序原理及其js實現

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。首先簡單了解下堆結構。堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序...

堆排序實現

今天抽空寫了個堆排序的演算法,廢話不多說,直接上源 include include includeusing namespace std define maxsize 6 void print int a,int size maxsize void percolate up int a,int si...

堆排序實現

1 堆排序演算法描述 1 定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 2 當然,這是小根堆,大根堆則換成 號。k i 相當於 二叉樹的非 葉子結點,k 2i 則是左子節點,k 2i 1 是右子節點...