經典排序演算法之堆排序

2022-03-11 22:19:07 字數 1009 閱讀 2669

經典排序演算法之堆排序

若以公升序排序說明,把陣列轉換成最大堆積(max-heap heap),這是一種滿足最大堆積性質(max-heap property)的二叉樹:對於除了根之外的每個節點i, a[parent(i)] ≥ a[i]。

重複從最大堆積取出數值最大的結點(把根結點和最後乙個結點交換,把交換後的最後乙個結點移出堆),並讓殘餘的堆積維持最大堆積性質。

最大堆積即:父節點總是大於子節點的完全二叉樹

完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

若將和此序列對應的一維陣列(即以一維陣列作此序列的儲存結構)看成是乙個完全二叉樹,則堆的含義表明,完全二叉樹中所有的非葉子節點的值均不大於(或不小於)其左右孩子節點的值。

例如:序列 對應完全二叉樹如下:

在實現堆排序前我們需要解決兩個問題:

(1):如何將乙個無序序列建成乙個堆?

(2):如何在輸出堆頂元素之後,調整剩餘元素成為乙個新的堆?

function heapsort(arr) 

function maxheap(start, end)

// 和父節點比較大小

if (arr[dad] > arr[son]) else}}

let len = arr.length;

// 建堆,從最後乙個非葉子節點開始調整

// 子節點 c = 父節點f*2 + 1 / f*2 + 2

// 陣列長度為n,最後乙個節點則為n-1,則最後乙個父節點為n/2 - 1

for (let i = (len >> 1) - 1; i >= 0; i--)

// 先將根節點和最後乙個節點交換,然後取走根(此時為陣列最後乙個節點),重新建堆

for (let i = len - 1; i > 0; i--)

return arr;

}

堆排序wiki

堆排序詳解

經典排序演算法之堆排序

堆排序是一種選擇排序,是不穩定的排序方法。特點 在排序過程中,將排序陣列看成是一棵完全二叉樹儲存結構,利用完全二叉樹中父節點和孩子節點之間的內在關係,在當前無序區中選擇關鍵字最大 最小 的記錄。基本思想 堆分大根堆和小根堆,大根堆是父節點比所有子節點都大,小根堆是父節點比所有子節點都小。下面以大根堆...

經典演算法之堆排序

author s email wardseptember gmail.com date 2017.12.5 堆排序 堆是一種資料結構,可以把堆看成一棵完全二叉樹,這棵樹滿足 任何乙個非葉子 結點的值都不大於 或不小於 其左右孩子結點的值。若父親大 孩子小,則這樣的堆 叫做大頂推 若父親小 孩子大,則...

經典演算法之堆排序

以堆的方式去排序,使最大值位於根節點,之後就縮小尺寸,調整位置。時間複雜度o n logn 不是很穩定 1.建立乙個堆 2.把堆首最大值和堆尾互換位置 3.縮小堆尺寸,調整位置 4.重複 直至堆尺寸為1 private int heapsort int source return arr priva...