經典排序演算法之堆排序
若以公升序排序說明,把陣列轉換成最大堆積(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...