堆積,是一種樹狀結構,用於實現「優先佇列(Priority queue)」。Priority queue是資料結構的一種,可以自由追加數據,讀取資料時,從最小值開始選取。
堆積是一種完整的二元樹,儲存在一維陣列內,分成MaxHeap及MinHeap。

建立Heap步驟如下:
import random
#從1-100中隨機讀取8個數字
nums = random.sample(range(1,100), 9)
print(nums)
def max_heapify(h, n, x):
    #如果(2*x+1) <= n,表示有右子節點
    if (2*x+1) <= n :
        #如果h[2*x] > h[2*x+1],表示左子節點大於右子節點
        if h[2*x] > h[2*x+1]:
            max = 2*x
        else:
            max = 2*x+1
    else:
        max = 2*x
    #如果h[x]<h[max],則兩個子節點互換
    if h[x] < h[max]:
        h[x], h[max] = h[max], h[x]
        #如果2*max<=n,表示h[max]也有子節點,recursion max_heapify是否與孫節點互換
        if 2*max <= n:
            max_heapify(h, n, max)
#將任何陣列轉換為Max Heap
def build_max_heap(h, n):
    #迴圈變數
    for i in range(n//2, 0, -1):
        max_heapify(h, n, i)
def heap_sort(h, n):
    build_max_heap(h, len(h)-1)
    print(h)
    for i in range(n, 1, -1):
        h[i], h[1] = h[1], h[i]
        if i > 2:
            max_heapify(h, i-1, 1)
        print(h)
heap_sort(nums, len(nums)-1)
print(nums)
let heapSize;
let arr = [15, 3, 17, 18, 20, 2, 1, 666];
heapSort();
console.log(arr);
function buildMaxHeap() {
  heapSize = arr.length - 1;
  for (let i = Math.floor(heapSize / 2); i >= 0; i--) {
    maxHeapify(i);
  }
}
function maxHeapify(i) {
  let largest;
  let l = i * 2 + 1;
  let r = i * 2 + 2;
  if (l <= heapSize && arr[l] > arr[i]) {
    largest = l;
  } else {
    largest = i;
  }
  if (r <= heapSize && arr[r] > arr[largest]) {
    largest = r;
  }
  if (largest != i) {
    // swap A[i] with A[largest]
    let temp = arr[i];
    arr[i] = arr[largest];
    arr[largest] = temp;
    maxHeapify(largest);
  }
}
function heapSort() {
  buildMaxHeap();
  for (let i = arr.length - 1; i >= 0; i--) {
    // exchange A[0] with A[i]
    let temp = arr[0];
    arr[0] = arr[i];
    arr[i] = temp;
    heapSize -= 1;
    maxHeapify(0);
  }
  return arr;
}
排序演算法到今天告一個段落,明天要開始新的演算法,下表整理了這幾天的排序演算法:

後續會再繼續補充資料,目前先這樣吧!